From: Luo <xionghu....@intel.com> --- src/cl_alloc.c | 1 + src/cl_event.c | 76 ++++++++++++++++++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 34 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_event.c b/src/cl_event.c index 727ee1f..620c116 100644 --- a/src/cl_event.c +++ b/src/cl_event.c @@ -260,12 +260,12 @@ 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)); 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]; + cb->wait_list[i] = event_wait_list[i]; cb->event = event; cb->next = NULL; cb->wait_user_events = NULL; @@ -276,12 +276,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 +292,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 +320,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]); } } } @@ -354,7 +359,7 @@ error: cl_free(u_ev); } if(cb->wait_list) - cl_free(cb->wait_list); + cl_free(cb->wait_list); cl_free(cb); } goto exit; @@ -363,7 +368,7 @@ error: void cl_event_set_status(cl_event event, cl_int status) { user_callback *user_cb; - user_event *u_ev, *u_ev_next; + user_event *u_ev; cl_int ret, i; cl_event evt; @@ -387,11 +392,11 @@ void cl_event_set_status(cl_event event, cl_int status) 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]); + cl_event_delete(event->enqueue_cb->wait_list[i]); pthread_mutex_lock(&event->ctx->event_lock); if(event->enqueue_cb->wait_list) - cl_free(event->enqueue_cb->wait_list); + cl_free(event->enqueue_cb->wait_list); cl_free(event->enqueue_cb); event->enqueue_cb = NULL; } @@ -419,22 +424,25 @@ void cl_event_set_status(cl_event event, cl_int status) /* Check all defer enqueue */ enqueue_callback *cb, *enqueue_cb = event->waits_head; while(enqueue_cb) { - /* Remove this user event in enqueue_cb */ - while(enqueue_cb->wait_user_events && - enqueue_cb->wait_user_events->event == event) { - u_ev = enqueue_cb->wait_user_events; - enqueue_cb->wait_user_events = enqueue_cb->wait_user_events->next; - cl_free(u_ev); - } - + /* Remove this user event in enqueue_cb, update the header if needed. */ u_ev = enqueue_cb->wait_user_events; + user_event * u_prev = NULL; + user_event *tmp =NULL; while(u_ev) { - u_ev_next = u_ev->next; - if(u_ev_next && u_ev_next->event == event) { - u_ev->next = u_ev_next->next; - cl_free(u_ev_next); - } else - u_ev->next = u_ev_next; + if(u_ev && u_ev->event == event) { + if(u_prev){ + u_prev->next = u_ev->next; + } + tmp = u_ev; + u_ev = u_ev ->next; + cl_free(tmp); + }else{ + if(!u_prev){ + enqueue_cb->wait_user_events = u_ev; + } + u_prev=u_ev; + u_ev = u_ev->next; + } } /* Still wait on other user events */ -- 1.8.1.2 _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/beignet