diff options
author | Chad Versace <[email protected]> | 2016-09-27 23:33:45 -0700 |
---|---|---|
committer | Chad Versace <[email protected]> | 2016-10-05 17:09:24 -0700 |
commit | ce1d67c2e5916e97bb65c0bd3b782efca7d3dea5 (patch) | |
tree | f3f546b278155741fea10503aed4ac003982c34b /src/mesa | |
parent | 28ab2570c8994993acf199e6c728c0f316bf253a (diff) |
i965/sync: Fix uninitalized usage and leak of mutex
We locked an unitialized mutex in the callstack
glClientWaitSync
intel_gl_client_wait_sync
brw_fence_client_wait_sync
because we forgot to initialize it in intel_gl_fence_sync.
(The EGLSync codepath didn't have this bug. It initialized the mutex in
intel_dri_create_sync).
We also forgot to tear down (mtx_destroy) the mutex when destroying
the sync object.
Cc: [email protected]
Reviewed-by: Iago Toral Quiroga <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_syncobj.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_syncobj.c b/src/mesa/drivers/dri/i965/intel_syncobj.c index dfda4487923..4276f3f9954 100644 --- a/src/mesa/drivers/dri/i965/intel_syncobj.c +++ b/src/mesa/drivers/dri/i965/intel_syncobj.c @@ -58,10 +58,20 @@ struct intel_gl_sync_object { }; static void +brw_fence_init(struct brw_context *brw, struct brw_fence *fence) +{ + fence->brw = brw; + fence->batch_bo = NULL; + mtx_init(&fence->mutex, mtx_plain); +} + +static void brw_fence_finish(struct brw_fence *fence) { if (fence->batch_bo) drm_intel_bo_unreference(fence->batch_bo); + + mtx_destroy(&fence->mutex); } static void @@ -186,6 +196,7 @@ intel_gl_fence_sync(struct gl_context *ctx, struct gl_sync_object *s, struct brw_context *brw = brw_context(ctx); struct intel_gl_sync_object *sync = (struct intel_gl_sync_object *)s; + brw_fence_init(brw, &sync->fence); brw_fence_insert(brw, &sync->fence); } @@ -240,8 +251,7 @@ intel_dri_create_fence(__DRIcontext *ctx) if (!fence) return NULL; - mtx_init(&fence->mutex, mtx_plain); - fence->brw = brw; + brw_fence_init(brw, fence); brw_fence_insert(brw, fence); return fence; |