From 7a5ac0c0dfbf48b3d0ae2500047e3f831ba0068f Mon Sep 17 00:00:00 2001
From: Yichao Yu <yyc1992@gmail.com>
Date: Sat, 24 May 2014 14:41:53 -0400
Subject: [PATCH] wait_for_events

---
 pyopencl/c_wrapper/wrap_cl_core.h |  1 +
 pyopencl/cffi_cl.py               |  5 +++++
 src/c_wrapper/wrap_cl.cpp         | 11 ++++++++++-
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h
index 5e17b0de..8a2cb021 100644
--- a/pyopencl/c_wrapper/wrap_cl_core.h
+++ b/pyopencl/c_wrapper/wrap_cl_core.h
@@ -108,6 +108,7 @@ 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 *wait_for_events(const clobj_t *_wait_for, uint32_t num_wait_for);
 // Nanny Event
 unsigned long nanny_event__get_ward(clobj_t evt);
 // enqueue_*
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index c6a3e5fb..a2cef461 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -696,7 +696,12 @@ class Event(_Common):
     def wait(self):
         _handle_error(_lib.event__wait(self.ptr))
 
+def wait_for_events(wait_for):
+    _handle_error(_lib.wait_for_events(*_c_obj_list(wait_for)))
+
 class NannyEvent(Event):
+    # TODO disable/handle write to buffer from bytes since the data may be moved
+    # by GC
     def get_ward(self):
         return _find_obj(_lib.nanny_event__get_ward(self.ptr))
 
diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp
index fff57435..7140d38e 100644
--- a/src/c_wrapper/wrap_cl.cpp
+++ b/src/c_wrapper/wrap_cl.cpp
@@ -2181,6 +2181,15 @@ event__wait(clobj_t evt)
         });
 }
 
+error*
+wait_for_events(const clobj_t *_wait_for, uint32_t num_wait_for)
+{
+    auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
+    return c_handle_error([&] {
+            pyopencl_call_guarded(clWaitForEvents,
+                                  num_wait_for, wait_for.get());
+        });
+}
 
 // Nanny Event
 unsigned long
@@ -2200,8 +2209,8 @@ enqueue_nd_range_kernel(clobj_t *_evt, clobj_t _queue, clobj_t _knl,
 {
     auto queue = static_cast<command_queue*>(_queue);
     auto knl = static_cast<kernel*>(_knl);
+    auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
     return c_handle_error([&] {
-            auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
             cl_event evt;
             retry_mem_error<void>([&] {
                     pyopencl_call_guarded(
-- 
GitLab