[Beignet] [PATCH 3/4] Refine and fix some event bugs.

Zhigang Gong zhigang.gong at linux.intel.com
Tue Sep 17 22:14:26 PDT 2013


LGTM, pushed, thanks.

On Tue, Sep 17, 2013 at 04:10:00PM +0800, Yang Rong wrote:
> 
> Signed-off-by: Yang Rong <rong.r.yang at intel.com>
> ---
>  src/cl_event.c | 40 ++++++++++++++++++++++++++++++++++------
>  src/cl_event.h |  2 +-
>  2 files changed, 35 insertions(+), 7 deletions(-)
> 
> diff --git a/src/cl_event.c b/src/cl_event.c
> index e882c7c..83e1f50 100644
> --- a/src/cl_event.c
> +++ b/src/cl_event.c
> @@ -27,6 +27,23 @@
>  #include <assert.h>
>  #include <stdio.h>
>  
> +inline cl_bool
> +cl_event_is_gpu_command_type(cl_command_type type)
> +{
> +  switch(type) {
> +    case CL_COMMAND_COPY_BUFFER:
> +    case CL_COMMAND_COPY_IMAGE:
> +    case CL_COMMAND_COPY_IMAGE_TO_BUFFER:
> +    case CL_COMMAND_COPY_BUFFER_TO_IMAGE:
> +    case CL_COMMAND_COPY_BUFFER_RECT:
> +    case CL_COMMAND_TASK:
> +    case CL_COMMAND_NDRANGE_KERNEL:
> +      return CL_TRUE;
> +    default:
> +      return CL_FALSE;
> +  }
> +}
> +
>  cl_event cl_event_new(cl_context ctx, cl_command_queue queue, cl_command_type type, cl_bool emplict)
>  {
>    cl_event event = NULL;
> @@ -56,7 +73,8 @@ cl_event cl_event_new(cl_context ctx, cl_command_queue queue, cl_command_type ty
>    }
>    else {
>      event->status = CL_QUEUED;
> -    event->gpgpu_event = cl_gpgpu_event_new(queue->gpgpu);
> +    if(cl_event_is_gpu_command_type(event->type))
> +      event->gpgpu_event = cl_gpgpu_event_new(queue->gpgpu);
>    }
>    cl_event_add_ref(event);       //dec when complete
>    event->user_cb = NULL;
> @@ -77,6 +95,8 @@ void cl_event_delete(cl_event event)
>    if (UNLIKELY(event == NULL))
>      return;
>  
> +  cl_event_update_status(event);
> +
>    if (atomic_dec(&event->ref_n) > 1)
>      return;
>  
> @@ -153,7 +173,7 @@ cl_int cl_event_check_waitlist(cl_uint num_events_in_wait_list,
>    /* check the event_wait_list and num_events_in_wait_list */
>    if((event_wait_list == NULL) &&
>       (num_events_in_wait_list > 0))
> -    goto exit;
> +    goto error;
>  
>    if ((event_wait_list != NULL) &&
>        (num_events_in_wait_list == 0)){
> @@ -225,7 +245,9 @@ void cl_event_new_enqueue_callback(cl_event event,
>    /* Allocate and inialize the structure itself */
>    TRY_ALLOC_NO_ERR (cb, CALLOC(enqueue_callback));
>    cb->num_events = num_events_in_wait_list;
> -  cb->wait_list = event_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->event = event;
>    cb->next = NULL;
>    cb->wait_user_events = NULL;
> @@ -274,8 +296,8 @@ void cl_event_new_enqueue_callback(cl_event event,
>        }
>      }
>    }
> -  if(data->queue != NULL) {
> -    assert(event->gpgpu_event);
> +
> +  if(data->queue != NULL && event->gpgpu_event != NULL) {
>      cl_gpgpu_event_pending(data->queue->gpgpu, event->gpgpu_event);
>      data->ptr = (void *)event->gpgpu_event;
>    }
> @@ -291,6 +313,8 @@ error:
>        cb->wait_user_events = cb->wait_user_events->next;
>        cl_free(u_ev);
>      }
> +    if(cb->wait_list)
> +      cl_free(cb->wait_list);
>      cl_free(cb);
>    }
>    goto exit;
> @@ -317,6 +341,8 @@ void cl_event_set_status(cl_event event, cl_int status)
>    if(status <= CL_COMPLETE) {
>      if(event->enqueue_cb) {
>        cl_enqueue_handle(&event->enqueue_cb->data);
> +      if(event->gpgpu_event)
> +        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
>  
>        pthread_mutex_unlock(&event->ctx->event_lock);
> @@ -324,6 +350,8 @@ void cl_event_set_status(cl_event event, cl_int status)
>          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);
>        event->enqueue_cb = NULL;
>      }
> @@ -385,7 +413,7 @@ void cl_event_set_status(cl_event event, cl_int status)
>      /* Call the pending operation */
>      evt = cb->event;
>      cl_event_set_status(cb->event, CL_COMPLETE);
> -    if(cb->event->emplict == CL_FALSE) {
> +    if(evt->emplict == CL_FALSE) {
>        cl_event_delete(evt);
>      }
>    }
> diff --git a/src/cl_event.h b/src/cl_event.h
> index c921cb2..8523abe 100644
> --- a/src/cl_event.h
> +++ b/src/cl_event.h
> @@ -39,7 +39,7 @@ typedef struct _enqueue_callback {
>    cl_event           event;            /* The event relative this enqueue callback */
>    enqueue_data       data;             /* Hold all enqueue callback's infomation */
>    cl_uint            num_events;       /* num events in wait list */
> -  const cl_event*    wait_list;        /* All event wait list this callback wait on */
> +  cl_event*          wait_list;        /* All event wait list this callback wait on */
>    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;
> -- 
> 1.8.1.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list