[Beignet] [PATCH] Fix: Event callback that not executed when command already marked CL_COMPLETE
Yang, Rong R
rong.r.yang at intel.com
Thu Mar 19 22:10:53 PDT 2015
One comment. Thanks find and fix it.
> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> David Couturier
> Sent: Friday, March 20, 2015 08:20
> To: Zou, Nanhai
> Cc: beignet at lists.freedesktop.org
> Subject: [Beignet] [PATCH] Fix: Event callback that not executed when
> command already marked CL_COMPLETE
>
> When trying to register a callback on the clEnqueueReadBuffer command,
> since it is processed synchroniously all the time, the command was marked
> CL_COMPLETE every time. If the event returned by clEnqueueReadBuffer
> was then used to register a callback function, the callback function did no
> check to execute it if nessary.
>
> Fixed by adding a check at the end of the cl_event_set_callback function.
>
> All tests passed.
>
> Signed-off-by: David Couturier <david.couturier at polymtl.ca>
> ---
> src/cl_event.c | 15 +++++++++++++++
> 1 file changed, 15 insertions(+)
>
> diff --git a/src/cl_event.c b/src/cl_event.c index f70e531..df4a5a5 100644
> --- a/src/cl_event.c
> +++ b/src/cl_event.c
> @@ -183,6 +183,21 @@ cl_int cl_event_set_callback(cl_event event ,
> cb->next = event->user_cb;
> event->user_cb = cb;
>
> + // It is possible that the event enqueued is already completed.
> + // clEnqueueReadBuffer can be synchronious and when the callback //
> + is registered after, it still needs to get executed.
> + if(event->status == CL_COMPLETE) {
> + /* Call user callback */
> + user_callback *user_cb = event->user_cb;
> + while(user_cb) {
> + if(user_cb->status >= CL_COMPLETE) {
> + user_cb->executed = CL_TRUE;
> + user_cb->pfn_notify(event, event->status,
> user_cb->user_data);
> + }
> + user_cb = user_cb->next;
> + }
I think only the current callback should be called. Assume the scenario:
clEnqueueReadBuffer(......,ev);
clSetEventCallback(ev, CL_SUBMITTED, ...);
clSetEventCallback(ev, CL_COMPLETE, ....);
In the second clSetEventCallback, the first callback have been executed, only need execute the second callback.
So need execute current callback when the event's status <= command_exec_callback_type.
> + }
> +
> exit:
> return err;
> error:
> --
> 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