[Beignet] [PATCH V2] Fix event pthread_mutex_lock dead lock.

Yang Rong rong.r.yang at intel.com
Tue Aug 13 20:08:01 PDT 2013


In function cl_event_set_status, between pthread_mutex_lock and pthread_mutex_unlock
will call cl_event_delete, which also require the same lock, cause deak lock.
Unlock it before call cl_event_delete.

Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
 src/cl_event.c |   21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/src/cl_event.c b/src/cl_event.c
index 48f24e5..e882c7c 100644
--- a/src/cl_event.c
+++ b/src/cl_event.c
@@ -305,23 +305,36 @@ void cl_event_set_status(cl_event event, cl_int status)
 
   pthread_mutex_lock(&event->ctx->event_lock);
   if(status >= event->status) {
-   return;
+    pthread_mutex_unlock(&event->ctx->event_lock);
+    return;
+  }
+  if(event->status <= CL_COMPLETE) {
+    event->status = status;    //have done enqueue before or doing in another thread
+    pthread_mutex_unlock(&event->ctx->event_lock);
+    return;
   }
 
   if(status <= CL_COMPLETE) {
     if(event->enqueue_cb) {
+      cl_enqueue_handle(&event->enqueue_cb->data);
+      event->status = status;  //Change the event status after enqueue and befor unlock
+
+      pthread_mutex_unlock(&event->ctx->event_lock);
       for(i=0; i<event->enqueue_cb->num_events; i++)
         cl_event_delete(event->enqueue_cb->wait_list[i]);
+      pthread_mutex_lock(&event->ctx->event_lock);
 
-      cl_enqueue_handle(&event->enqueue_cb->data);
       cl_free(event->enqueue_cb);
       event->enqueue_cb = NULL;
     }
-    cl_event_delete(event);
   }
-  event->status = status;
+  if(event->status >= status)  //maybe changed in other threads
+    event->status = status;
   pthread_mutex_unlock(&event->ctx->event_lock);
 
+  if(event->status <= CL_COMPLETE)
+    cl_event_delete(event);
+
   /* Call user callback */
   user_cb = event->user_cb;
   while(user_cb) {
-- 
1.7.10.4



More information about the Beignet mailing list