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