From: Luo <xionghu....@intel.com>

1 remove useless data element;
2 fix some logic bugs;
3 add implementation for clEnqueueMarkerWithWaitList.
---
 src/cl_alloc.c |  1 +
 src/cl_api.c   | 22 +++++++++++++++++---
 src/cl_event.c | 65 ++++++++++++++++++++++++++++++++++++----------------------
 src/cl_event.h |  4 +++-
 4 files changed, 64 insertions(+), 28 deletions(-)

diff --git a/src/cl_alloc.c b/src/cl_alloc.c
index 20d5578..93d2e6a 100644
--- a/src/cl_alloc.c
+++ b/src/cl_alloc.c
@@ -71,6 +71,7 @@ cl_free(void *ptr)
     return;
   atomic_dec(&cl_alloc_n);
   free(ptr);
+  ptr = NULL;
 }
 
 LOCAL size_t
diff --git a/src/cl_api.c b/src/cl_api.c
index 1543ff4..a8c4fbe 100644
--- a/src/cl_api.c
+++ b/src/cl_api.c
@@ -2621,10 +2621,26 @@ clEnqueueNativeKernel(cl_command_queue   command_queue,
 error:
   return err;
 }
+clEnqueueMarker(cl_command_queue command_queue,
+    cl_event *event)
+{
+  cl_int err = CL_SUCCESS;
+  CHECK_QUEUE(command_queue);
+  if(event == NULL) {
+    err = CL_INVALID_VALUE;
+    goto error;
+  }
+
+  cl_event_marker_with_wait_list(command_queue, 0, NULL, event);
+error:
+  return err;
+}
 
 cl_int
-clEnqueueMarker(cl_command_queue     command_queue,
-                cl_event *           event)
+clEnqueueMarkerWithWaitList(cl_command_queue command_queue,
+        cl_uint num_events_in_wait_list,
+        const cl_event *event_wait_list,
+        cl_event *event)
 {
   cl_int err = CL_SUCCESS;
   CHECK_QUEUE(command_queue);
@@ -2633,7 +2649,7 @@ clEnqueueMarker(cl_command_queue     command_queue,
     goto error;
   }
 
-  cl_event_marker(command_queue, event);
+  cl_event_marker_with_wait_list(command_queue, num_events_in_wait_list, 
event_wait_list, event);
 error:
   return err;
 }
diff --git a/src/cl_event.c b/src/cl_event.c
index 727ee1f..203bfc2 100644
--- a/src/cl_event.c
+++ b/src/cl_event.c
@@ -224,7 +224,7 @@ cl_int cl_event_wait_events(cl_uint 
num_events_in_wait_list, const cl_event *eve
     if((event_wait_list[i]->type == CL_COMMAND_USER) ||
        (event_wait_list[i]->enqueue_cb &&
        (event_wait_list[i]->enqueue_cb->wait_user_events != NULL))){
-      for(j=0; j<num_events_in_wait_list; j++)
+      for(j=0; j<= i; j++)
         cl_event_add_ref(event_wait_list[j]);  //add defer enqueue's wait 
event reference
       return CL_ENQUEUE_EXECUTE_DEFER;
     }
@@ -244,7 +244,7 @@ cl_int cl_event_wait_events(cl_uint 
num_events_in_wait_list, const cl_event *eve
       return CL_ENQUEUE_EXECUTE_DEFER;
     if(event_wait_list[i]->gpgpu_event)
       cl_gpgpu_event_update_status(event_wait_list[i]->gpgpu_event, 1);
-    cl_event_set_status(event_wait_list[i], CL_COMPLETE);  //Execute user's 
callback
+   //// cl_event_set_status(event_wait_list[i], CL_COMPLETE);  //Execute 
user's callback
   }
   return CL_ENQUEUE_EXECUTE_IMM;
 }
@@ -260,12 +260,14 @@ void cl_event_new_enqueue_callback(cl_event event,
   cl_int i;
   GET_QUEUE_THREAD_GPGPU(data->queue);
 
-  /* Allocate and inialize the structure itself */
+  /* Allocate and initialize the structure itself */
   TRY_ALLOC_NO_ERR (cb, CALLOC(enqueue_callback));
+#if 0
   cb->num_events = num_events_in_wait_list;
   TRY_ALLOC_NO_ERR (cb->wait_list, CALLOC_ARRAY(cl_event, 
num_events_in_wait_list));
   for(i=0; i<num_events_in_wait_list; i++)
     cb->wait_list[i] = event_wait_list[i];
+#endif
   cb->event = event;
   cb->next = NULL;
   cb->wait_user_events = NULL;
@@ -276,12 +278,13 @@ void cl_event_new_enqueue_callback(cl_event event,
       node = queue->wait_events[i]->waits_head;
       if(node == NULL)
         queue->wait_events[i]->waits_head = cb;
-      else
-        while((node != cb) && node->next)
-          node = node->next;
-        if(node == cb)   //wait on dup user event
-          continue;
-        node->next = cb;
+      else{
+          while((node != cb) && node->next)
+              node = node->next;
+          if(node == cb)   //wait on dup user event
+              continue;
+          node->next = cb;
+      }
 
       /* Insert the user event to enqueue_callback's wait_user_events */
       TRY_ALLOC_NO_ERR (u_ev, CALLOC(user_event));
@@ -291,7 +294,7 @@ void cl_event_new_enqueue_callback(cl_event event,
     }
   }
 
-  /* Find out all user events that events in event_wait_list wait */
+  /* Find out all user events that in event_wait_list wait */
   for(i=0; i<num_events_in_wait_list; i++) {
     if(event_wait_list[i]->status <= CL_COMPLETE)
       continue;
@@ -319,21 +322,25 @@ void cl_event_new_enqueue_callback(cl_event event,
       while(user_events != NULL) {
         /* Insert the enqueue_callback to user event's  waits_tail */
         node = user_events->event->waits_head;
-        while((node != cb) && node->next)
-          node = node->next;
-        if(node == cb) {  //wait on dup user event
-          user_events = user_events->next;
-          continue;
+        if(node == NULL)
+            event_wait_list[i]->waits_head = cb;
+        else{
+            while((node != cb) && node->next)
+                node = node->next;
+            if(node == cb) {  //wait on dup user event
+                user_events = user_events->next;
+                continue;
+            }
+            node->next = cb;
         }
-        node->next = cb;
 
         /* Insert the user event to enqueue_callback's wait_user_events */
         TRY_ALLOC_NO_ERR (u_ev, CALLOC(user_event));
         u_ev->event = user_events->event;
         u_ev->next = cb->wait_user_events;
         cb->wait_user_events = u_ev;
+        cl_command_queue_insert_event(event->queue, user_events->event);
         user_events = user_events->next;
-        cl_command_queue_insert_event(event->queue, event_wait_list[i]);
       }
     }
   }
@@ -353,8 +360,10 @@ error:
       cb->wait_user_events = cb->wait_user_events->next;
       cl_free(u_ev);
     }
+#if 0
     if(cb->wait_list)
       cl_free(cb->wait_list);
+#endif
     cl_free(cb);
   }
   goto exit;
@@ -363,8 +372,9 @@ error:
 void cl_event_set_status(cl_event event, cl_int status)
 {
   user_callback *user_cb;
-  user_event    *u_ev, *u_ev_next;
-  cl_int ret, i;
+  user_event    *u_ev;
+  //user_event    *u_ev_next;
+  //cl_int ret, i;
   cl_event evt;
 
   pthread_mutex_lock(&event->ctx->event_lock);
@@ -385,6 +395,7 @@ void cl_event_set_status(cl_event event, cl_int status)
         cl_gpgpu_event_update_status(event->gpgpu_event, 1);  //now set 
complet, need refine
       event->status = status;  //Change the event status after enqueue and 
befor unlock
 
+#if 0
       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]);
@@ -392,6 +403,8 @@ void cl_event_set_status(cl_event event, cl_int status)
 
       if(event->enqueue_cb->wait_list)
         cl_free(event->enqueue_cb->wait_list);
+#endif
+
       cl_free(event->enqueue_cb);
       event->enqueue_cb = NULL;
     }
@@ -426,7 +439,7 @@ void cl_event_set_status(cl_event event, cl_int status)
       enqueue_cb->wait_user_events = enqueue_cb->wait_user_events->next;
       cl_free(u_ev);
     }
-
+#if 0
     u_ev = enqueue_cb->wait_user_events;
     while(u_ev) {
       u_ev_next = u_ev->next;
@@ -436,7 +449,7 @@ void cl_event_set_status(cl_event event, cl_int status)
       } else
         u_ev->next = u_ev_next;
     }
-
+#endif
     /* Still wait on other user events */
     if(enqueue_cb->wait_user_events != NULL) {
       enqueue_cb = enqueue_cb->next;
@@ -447,11 +460,12 @@ void cl_event_set_status(cl_event event, cl_int status)
     cl_command_queue_remove_event(enqueue_cb->event->queue, event);
 
     /* All user events complete, now wait enqueue events */
+#if 0
     ret = cl_event_wait_events(enqueue_cb->num_events, enqueue_cb->wait_list,
                                enqueue_cb->event->queue);
-    ret = ret;
+//    ret = ret;
     assert(ret != CL_ENQUEUE_EXECUTE_DEFER);
-
+#endif
     cb = enqueue_cb;
     enqueue_cb = enqueue_cb->next;
 
@@ -474,7 +488,10 @@ void cl_event_update_status(cl_event event)
     cl_event_set_status(event, CL_COMPLETE);
 }
 
-cl_int cl_event_marker(cl_command_queue queue, cl_event* event)
+cl_int cl_event_marker_with_wait_list(cl_command_queue queue,
+        cl_uint num_events_in_wait_list,
+        const cl_event *event_wait_list,
+        cl_event* event)
 {
   enqueue_data data;
 
diff --git a/src/cl_event.h b/src/cl_event.h
index 3c61110..a1c10fc 100644
--- a/src/cl_event.h
+++ b/src/cl_event.h
@@ -38,8 +38,10 @@ typedef struct _user_event {
 typedef struct _enqueue_callback {
   cl_event           event;            /* The event relative this enqueue 
callback */
   enqueue_data       data;             /* Hold all enqueue callback's 
infomation */
+#if 0
   cl_uint            num_events;       /* num events in wait list */
   cl_event*          wait_list;        /* All event wait list this callback 
wait on */
+#endif
   user_event*        wait_user_events; /* The head of user event list the 
callback wait on */
   struct _enqueue_callback*  next;     /* The  next enqueue callback in wait 
list */
 } enqueue_callback;
@@ -90,7 +92,7 @@ void cl_event_set_status(cl_event, cl_int);
 /* Check and update event status */
 void cl_event_update_status(cl_event);
 /* Create the marker event */
-cl_int cl_event_marker(cl_command_queue, cl_event*);
+cl_int cl_event_marker_with_wait_list(cl_command_queue, cl_uint, const 
cl_event *,  cl_event*);
 /* Do the event profiling */
 cl_int cl_event_get_timestamp(cl_event event, cl_profiling_info param_name);
 #endif /* __CL_EVENT_H__ */
-- 
1.8.1.2

_______________________________________________
Beignet mailing list
Beignet@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/beignet

Reply via email to