From 4f4189d1d62af980f3289f6fc62176fee06c52b2 Mon Sep 17 00:00:00 2001 From: Yichao Yu <yyc1992@gmail.com> Date: Sun, 25 May 2014 13:46:03 -0400 Subject: [PATCH] Event.set_callback --- pyopencl/c_wrapper/wrap_cl_core.h | 2 ++ pyopencl/cffi_cl.py | 7 +++++++ src/c_wrapper/wrap_cl.cpp | 17 +++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h index 8a2cb021..97b8c2ef 100644 --- a/pyopencl/c_wrapper/wrap_cl_core.h +++ b/pyopencl/c_wrapper/wrap_cl_core.h @@ -108,6 +108,8 @@ error *image__get_image_info(clobj_t image, cl_image_info param, error *event__get_profiling_info(clobj_t event, cl_profiling_info param, generic_info *out); error *event__wait(clobj_t event); +error *event__set_callback(clobj_t _evt, cl_int type, void (*cb)(cl_int), + void (*ref)(unsigned long)); error *wait_for_events(const clobj_t *_wait_for, uint32_t num_wait_for); // Nanny Event unsigned long nanny_event__get_ward(clobj_t evt); diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py index ba6d6eb8..71340d3f 100644 --- a/pyopencl/cffi_cl.py +++ b/pyopencl/cffi_cl.py @@ -696,6 +696,13 @@ class Event(_Common): def wait(self): _handle_error(_lib.event__wait(self.ptr)) + def set_callback(self, _type, cb, *args, **kwargs): + @_ffi.callback('void(cl_int)') + def _func(status): + cb(status, *args, **kwargs) + _handle_error(_lib.event__set_callback(self.ptr, _type, _func, + _get_ref_func(_func))) + def wait_for_events(wait_for): _handle_error(_lib.wait_for_events(*_c_obj_list(wait_for))) diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp index 95f3a85c..e015b22d 100644 --- a/src/c_wrapper/wrap_cl.cpp +++ b/src/c_wrapper/wrap_cl.cpp @@ -2220,6 +2220,23 @@ event__wait(clobj_t evt) }); } +#if PYOPENCL_CL_VERSION >= 0x1010 +error* +event__set_callback(clobj_t _evt, cl_int type, void (*cb)(cl_int), + void (*ref)(unsigned long)) +{ + auto evt = static_cast<event*>(_evt); + return c_handle_error([&] { + unsigned long obj_id = next_obj_id(); + evt->set_callback(type, [=] (cl_int status) { + cb(status); + python_deref(obj_id); + }); + ref(obj_id); + }); +} +#endif + error* wait_for_events(const clobj_t *_wait_for, uint32_t num_wait_for) { -- GitLab