[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