[Beignet] [Patch V2] Fix the opencv_test_core/OCL_Arithm random segment fault.

Zhigang Gong zhigang.gong at linux.intel.com
Thu Nov 20 23:59:04 PST 2014


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 <rong.r.yang at intel.com>
> ---
>  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
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list