This version LGTM, just pushed, thanks.
On Fri, Nov 21, 2014 at 02:57:27PM +0800, Yang Rong wrote: > If call cl_event_delete before call back, then event will be deleted if > application release event in the call back. So must move the cl_event_delete > at the last. > > V2: V1 will not delete event if not user event, also need delete it. > Signed-off-by: Yang Rong <[email protected]> > --- > src/cl_event.c | 73 > +++++++++++++++++++++++++++++----------------------------- > 1 file changed, 36 insertions(+), 37 deletions(-) > > diff --git a/src/cl_event.c b/src/cl_event.c > index e20342a..f70e531 100644 > --- a/src/cl_event.c > +++ b/src/cl_event.c > @@ -436,9 +436,6 @@ void cl_event_set_status(cl_event event, cl_int status) > 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) { > @@ -449,46 +446,48 @@ void cl_event_set_status(cl_event event, cl_int status) > user_cb = user_cb->next; > } > > - if(event->type != CL_COMMAND_USER) > - return; > + if(event->type == CL_COMMAND_USER) { > + /* Check all defer enqueue */ > + enqueue_callback *cb, *enqueue_cb = event->waits_head; > + while(enqueue_cb) { > + /* Remove this user event in enqueue_cb, update the header if needed. > */ > + cl_event_remove_user_event(&enqueue_cb->wait_user_events, event); > + cl_event_delete(event); > + > + /* Still wait on other user events */ > + if(enqueue_cb->wait_user_events != NULL) { > + enqueue_cb = enqueue_cb->next; > + continue; > + } > > - /* Check all defer enqueue */ > - enqueue_callback *cb, *enqueue_cb = event->waits_head; > - while(enqueue_cb) { > - /* Remove this user event in enqueue_cb, update the header if needed. */ > - cl_event_remove_user_event(&enqueue_cb->wait_user_events, event); > - cl_event_delete(event); > + //remove user event frome enqueue_cb's ctx > + cl_command_queue_remove_event(enqueue_cb->event->queue, event); > + cl_command_queue_remove_barrier_event(enqueue_cb->event->queue, event); > > - /* Still wait on other user events */ > - if(enqueue_cb->wait_user_events != NULL) { > + /* All user events complete, now wait enqueue events */ > + ret = cl_event_wait_events(enqueue_cb->num_events, > enqueue_cb->wait_list, > + enqueue_cb->event->queue); > + assert(ret != CL_ENQUEUE_EXECUTE_DEFER); > + ret = ~ret; > + cb = enqueue_cb; > enqueue_cb = enqueue_cb->next; > - continue; > - } > > - //remove user event frome enqueue_cb's ctx > - cl_command_queue_remove_event(enqueue_cb->event->queue, event); > - cl_command_queue_remove_barrier_event(enqueue_cb->event->queue, event); > - > - /* All user events complete, now wait enqueue events */ > - ret = cl_event_wait_events(enqueue_cb->num_events, enqueue_cb->wait_list, > - enqueue_cb->event->queue); > - assert(ret != CL_ENQUEUE_EXECUTE_DEFER); > - ret = ~ret; > - cb = enqueue_cb; > - enqueue_cb = enqueue_cb->next; > - > - /* Call the pending operation */ > - evt = cb->event; > - /* TODO: if this event wait on several events, one event's > - status is error, the others is complete, what's the status > - of this event? Can't find the description in OpenCL spec. > - Simply update to latest finish wait event.*/ > - cl_event_set_status(cb->event, status); > - if(evt->emplict == CL_FALSE) { > - cl_event_delete(evt); > + /* Call the pending operation */ > + evt = cb->event; > + /* TODO: if this event wait on several events, one event's > + status is error, the others is complete, what's the status > + of this event? Can't find the description in OpenCL spec. > + Simply update to latest finish wait event.*/ > + cl_event_set_status(cb->event, status); > + if(evt->emplict == CL_FALSE) { > + cl_event_delete(evt); > + } > } > + event->waits_head = NULL; > } > - event->waits_head = NULL; > + > + if(event->status <= CL_COMPLETE) > + cl_event_delete(event); > } > > void cl_event_update_status(cl_event event, int wait) > -- > 1.9.1 > > _______________________________________________ > Beignet mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
