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