Mesa (master): ilo: protect the decode context with a mutex

Chia-I Wu olv at kemper.freedesktop.org
Mon Mar 10 08:46:19 UTC 2014


Module: Mesa
Branch: master
Commit: 72956ed374b73391d4d033722d3032fa6496b5cb
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=72956ed374b73391d4d033722d3032fa6496b5cb

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Mon Mar 10 12:25:18 2014 +0800

ilo: protect the decode context with a mutex

The decode context is not thread safe.

---

 src/gallium/winsys/intel/drm/intel_drm_winsys.c |   27 +++++++++++++++++------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/src/gallium/winsys/intel/drm/intel_drm_winsys.c b/src/gallium/winsys/intel/drm/intel_drm_winsys.c
index 364f221..5789114 100644
--- a/src/gallium/winsys/intel/drm/intel_drm_winsys.c
+++ b/src/gallium/winsys/intel/drm/intel_drm_winsys.c
@@ -35,6 +35,7 @@
 #include <i915_drm.h>
 #include <intel_bufmgr.h>
 
+#include "os/os_thread.h"
 #include "state_tracker/drm_driver.h"
 #include "pipe/p_state.h"
 #include "util/u_inlines.h"
@@ -50,6 +51,8 @@ struct intel_winsys {
    struct intel_winsys_info info;
    unsigned long exec_flags;
 
+   /* these are protected by the mutex */
+   pipe_mutex mutex;
    struct drm_intel_decode *decode;
 };
 
@@ -177,6 +180,8 @@ intel_winsys_create_for_fd(int fd)
       return NULL;
    }
 
+   pipe_mutex_init(winsys->mutex);
+
    if (!probe_winsys(winsys)) {
       drm_intel_bufmgr_destroy(winsys->bufmgr);
       FREE(winsys);
@@ -205,6 +210,7 @@ intel_winsys_destroy(struct intel_winsys *winsys)
    if (winsys->decode)
       drm_intel_decode_context_free(winsys->decode);
 
+   pipe_mutex_destroy(winsys->mutex);
    drm_intel_bufmgr_destroy(winsys->bufmgr);
    FREE(winsys);
 }
@@ -416,21 +422,26 @@ intel_winsys_decode_bo(struct intel_winsys *winsys,
 {
    void *ptr;
 
+   ptr = intel_bo_map(bo, false);
+   if (!ptr) {
+      debug_printf("failed to map buffer for decoding\n");
+      return;
+   }
+
+   pipe_mutex_lock(winsys->mutex);
+
    if (!winsys->decode) {
       winsys->decode = drm_intel_decode_context_alloc(winsys->info.devid);
-      if (!winsys->decode)
+      if (!winsys->decode) {
+         pipe_mutex_unlock(winsys->mutex);
+         intel_bo_unmap(bo);
          return;
+      }
 
       /* debug_printf()/debug_error() uses stderr by default */
       drm_intel_decode_set_output_file(winsys->decode, stderr);
    }
 
-   ptr = intel_bo_map(bo, false);
-   if (!ptr) {
-      debug_printf("failed to map buffer for decoding\n");
-      return;
-   }
-
    /* in dwords */
    used /= 4;
 
@@ -439,6 +450,8 @@ intel_winsys_decode_bo(struct intel_winsys *winsys,
 
    drm_intel_decode(winsys->decode);
 
+   pipe_mutex_unlock(winsys->mutex);
+
    intel_bo_unmap(bo);
 }
 




More information about the mesa-commit mailing list