diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h index 1445cb7ee713409f8757c6323d031d690070b2b2..879abcbbd11a85e79d87d171aa453907775fe22f 100644 --- a/pyopencl/c_wrapper/wrap_cl_core.h +++ b/pyopencl/c_wrapper/wrap_cl_core.h @@ -145,6 +145,9 @@ error *event__set_callback(clobj_t _evt, cl_int type, void *pyobj); error *wait_for_events(const clobj_t *_wait_for, uint32_t num_wait_for); // Nanny Event void *nanny_event__get_ward(clobj_t evt); +// User Event +error *create_user_event(clobj_t *_evt, clobj_t _ctx); +error *user_event__set_status(clobj_t _evt, cl_int status); // enqueue_* error *enqueue_nd_range_kernel(clobj_t *event, clobj_t queue, clobj_t kernel, cl_uint work_dim, diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py index aaeb9ebe9c492c2990c28b9a7183230db58433ac..5980453c8809b4c595ec8cf806fa22d3b8056614 100644 --- a/pyopencl/cffi_cl.py +++ b/pyopencl/cffi_cl.py @@ -930,8 +930,15 @@ class NannyEvent(Event): return return _ffi.from_handle(_handle).ward +class UserEvent(Event): + def __init__(self, ctx): + _evt = _ffi.new('clobj_t*') + _handle_error(_lib.create_user_event(_evt, ctx.ptr)) + self.ptr = _evt[0] + def set_status(self, status): + _handle_error(_lib.user_event__set_status(self.ptr, status)) + # TODO -# UserEvent # enqueue_migrate_mem_objects # enqueue_migrate_mem_objects_ext diff --git a/src/c_wrapper/event.cpp b/src/c_wrapper/event.cpp index add9639372431c734344e67a9b08396e96e18351..f577bfdbdc38b0e746944464c238042fda5eab0d 100644 --- a/src/c_wrapper/event.cpp +++ b/src/c_wrapper/event.cpp @@ -189,6 +189,18 @@ nanny_event::get_ward() const noexcept nullptr); } +#if PYOPENCL_CL_VERSION >= 0x1010 +class user_event : public event { +public: + using event::event; + PYOPENCL_INLINE void + set_status(cl_int status) + { + pyopencl_call_guarded(clSetUserEventStatus, this, status); + } +}; +#endif + } // c wrapper @@ -266,3 +278,26 @@ enqueue_wait_for_events(clobj_t _queue, const clobj_t *_wait_for, pyopencl_call_guarded(clEnqueueWaitForEvents, queue, wait_for); }); } + +#if PYOPENCL_CL_VERSION >= 0x1010 + +error* +create_user_event(clobj_t *_evt, clobj_t _ctx) +{ + auto ctx = static_cast<context*>(_ctx); + return c_handle_error([&] { + auto evt = pyopencl_call_guarded(clCreateUserEvent, ctx); + *_evt = pyopencl_convert_obj(user_event, clReleaseEvent, evt); + }); +} + +error* +user_event__set_status(clobj_t _evt, cl_int status) +{ + auto evt = static_cast<user_event*>(_evt); + return c_handle_error([&] { + evt->set_status(status); + }); +} + +#endif