From 47c1a3d8febaf4bf9a66ba1ea1288651d74f8554 Mon Sep 17 00:00:00 2001
From: Marko Bencun <mbencun@gmail.com>
Date: Sat, 31 Aug 2013 16:43:05 +0200
Subject: [PATCH] exceptions

---
 pyopencl/cffi_cl.py          |  9 +++++++--
 src/c_wrapper/wrap_cl.cpp    | 36 ++++++++++++++++++------------------
 src/c_wrapper/wrap_cl_core.h | 36 ++++++++++++++++++------------------
 3 files changed, 43 insertions(+), 38 deletions(-)

diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 198ad18e..dc1adcf1 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -263,13 +263,18 @@ class MemoryObject(MemoryObjectHolder):
     pass
         
 class Buffer(MemoryObjectHolder):
+    @classmethod
+    def _c_buffer_from_obj(cls, obj):
+        # assume numpy array for now
+        return _ffi.cast('void *', obj.__array_interface__['data'][0])
+        
     def __init__(self, context, flags, size=0, hostbuf=None):
         if hostbuf is not None and not (flags & (mem_flags.USE_HOST_PTR | mem_flags.COPY_HOST_PTR)):
             warnings.warn("'hostbuf' was passed, but no memory flags to make use of it.")
         c_hostbuf = _ffi.NULL
         if hostbuf is not None:
             # todo: buffer protocol; for now hostbuf is assumed to be a numpy array
-            c_hostbuf = _ffi.cast('void *', hostbuf.ctypes.data)
+            c_hostbuf = self._c_buffer_from_obj(hostbuf)
             hostbuf_size = hostbuf.nbytes
             if size > hostbuf_size:
                 raise RuntimeError("Buffer", status_code.INVALID_VALUE, "specified size is greater than host buffer size")
@@ -483,7 +488,7 @@ def enqueue_nd_range_kernel(queue, kernel, global_work_size, local_work_size, gl
 
 def _enqueue_read_buffer(cq, mem, buf, device_offset=0, is_blocking=True):
     # assume numpy
-    c_buf = _ffi.cast('void *', buf.ctypes.data)
+    c_buf = Buffer._c_buffer_from_obj(buf)
     size = buf.nbytes
     ptr_event = _ffi.new('void **')
     _handle_error(_lib._enqueue_read_buffer(
diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp
index c09f0524..d2f1f148 100644
--- a/src/c_wrapper/wrap_cl.cpp
+++ b/src/c_wrapper/wrap_cl.cpp
@@ -1955,7 +1955,7 @@ inline event *enqueue_nd_range_kernel(
 
   
 
-  void *get_platforms(void **ptr_platforms, uint32_t *num_platforms) {
+  ::error *get_platforms(void **ptr_platforms, uint32_t *num_platforms) {
     C_HANDLE_ERROR(
     *num_platforms = 0;
     PYOPENCL_CALL_GUARDED(clGetPlatformIDs, (0, 0, num_platforms));
@@ -1984,14 +1984,14 @@ inline event *enqueue_nd_range_kernel(
     }
   }
 
-  void *platform__get_info(void *ptr_platform, cl_platform_info param, generic_info *out) {
+  ::error *platform__get_info(void *ptr_platform, cl_platform_info param, generic_info *out) {
     C_HANDLE_ERROR(
     *out = static_cast<platform*>(ptr_platform)->get_info(param);
 		   )
     return 0;
   }
 
-  void *platform__get_devices(void *ptr_platform, void **ptr_devices, uint32_t *num_devices, cl_device_type devtype) {
+  ::error *platform__get_devices(void *ptr_platform, void **ptr_devices, uint32_t *num_devices, cl_device_type devtype) {
     typedef std::vector<cl_device_id> vec;
     C_HANDLE_ERROR(
     vec devices = static_cast<platform*>(ptr_platform)->get_devices(devtype);
@@ -2011,14 +2011,14 @@ inline event *enqueue_nd_range_kernel(
   }
 
 
-  void *device__get_info(void *ptr_device, cl_device_info param, generic_info *out) {
+  ::error *device__get_info(void *ptr_device, cl_device_info param, generic_info *out) {
     C_HANDLE_ERROR(
     *out = static_cast<device*>(ptr_device)->get_info(param);
 		   )
     return 0;
   }
 
-  void *_create_context(void **ptr_ctx, cl_context_properties *properties, cl_uint num_devices, void **ptr_devices) {
+  ::error *_create_context(void **ptr_ctx, cl_context_properties *properties, cl_uint num_devices, void **ptr_devices) {
     C_HANDLE_ERROR(
     cl_int status_code;
     std::vector<cl_device_id> devices(num_devices);
@@ -2037,7 +2037,7 @@ inline event *enqueue_nd_range_kernel(
     return 0;
   }
 
-  void *_create_command_queue(void **ptr_command_queue, void *ptr_context, void *ptr_device, cl_command_queue_properties properties) {
+  ::error *_create_command_queue(void **ptr_command_queue, void *ptr_context, void *ptr_device, cl_command_queue_properties properties) {
     context *ctx = static_cast<context*>(ptr_context);
     device *dev = static_cast<device*>(ptr_device);
     C_HANDLE_ERROR(
@@ -2046,7 +2046,7 @@ inline event *enqueue_nd_range_kernel(
     return 0;
   }
 
-  void *_create_buffer(void **ptr_buffer, void *ptr_context, cl_mem_flags flags, size_t size, void *hostbuf) {
+  ::error *_create_buffer(void **ptr_buffer, void *ptr_context, cl_mem_flags flags, size_t size, void *hostbuf) {
     context *ctx = static_cast<context*>(ptr_context);
     C_HANDLE_ERROR(
     *ptr_buffer = create_buffer_py(*ctx, flags, size, hostbuf);
@@ -2054,7 +2054,7 @@ inline event *enqueue_nd_range_kernel(
     return 0;
   }
 
-  void *_create_program_with_source(void **ptr_program, void *ptr_context, char *src) {
+  ::error *_create_program_with_source(void **ptr_program, void *ptr_context, char *src) {
     context *ctx = static_cast<context*>(ptr_context);
     C_HANDLE_ERROR(
     *ptr_program = create_program_with_source(*ctx, src);
@@ -2062,7 +2062,7 @@ inline event *enqueue_nd_range_kernel(
     return 0;
   }
 
-  void *_create_program_with_binary(void **ptr_program, void *ptr_context, cl_uint num_devices, void **ptr_devices, cl_uint num_binaries, char **binaries) {
+  ::error *_create_program_with_binary(void **ptr_program, void *ptr_context, cl_uint num_devices, void **ptr_devices, cl_uint num_binaries, char **binaries) {
     context *ctx = static_cast<context*>(ptr_context);
     C_HANDLE_ERROR(
     *ptr_program = create_program_with_binary(*ctx, num_devices, ptr_devices, num_binaries, binaries);
@@ -2077,14 +2077,14 @@ inline event *enqueue_nd_range_kernel(
     return 0;
   }
 
-  void *program__kind(void *ptr_program, int *kind) {
+  ::error *program__kind(void *ptr_program, int *kind) {
     C_HANDLE_ERROR(
 		   *kind = static_cast<program*>(ptr_program)->kind();
 		   )
     return 0;
   }
 
-  void *program__get_info__devices(void *ptr_program, void **ptr_devices, uint32_t *num_devices) {
+  ::error *program__get_info__devices(void *ptr_program, void **ptr_devices, uint32_t *num_devices) {
     typedef std::vector<cl_device_id> vec;
 
     // todo: refactor, same as get_devices()
@@ -2103,7 +2103,7 @@ inline event *enqueue_nd_range_kernel(
     
   }
 
-  void *program__get_info__binaries(void *ptr_program, char ***ptr_binaries, uint32_t *num_binaries) {
+  ::error *program__get_info__binaries(void *ptr_program, char ***ptr_binaries, uint32_t *num_binaries) {
     C_HANDLE_ERROR(
     *ptr_binaries = static_cast<program*>(ptr_program)->get_info__binaries(num_binaries);
 		   )
@@ -2139,7 +2139,7 @@ inline event *enqueue_nd_range_kernel(
     return static_cast<kernel*>(ptr_kernel)->hash();
   }
   
-  void *_create_kernel(void **ptr_kernel, void *ptr_program, char *name) {
+  ::error *_create_kernel(void **ptr_kernel, void *ptr_program, char *name) {
     program *prg = static_cast<program*>(ptr_program);
     C_HANDLE_ERROR(
     *ptr_kernel = new kernel(*prg, name);
@@ -2147,14 +2147,14 @@ inline event *enqueue_nd_range_kernel(
     return 0;
   }
 
-  void *kernel__get_info(void *ptr_kernel, cl_kernel_info param, generic_info *out) {
+  ::error *kernel__get_info(void *ptr_kernel, cl_kernel_info param, generic_info *out) {
     C_HANDLE_ERROR(
     *out = static_cast<kernel*>(ptr_kernel)->get_info(param);
 		   )
     return 0;
   }
 
-  void *kernel__set_arg_mem_buffer(void *ptr_kernel, cl_uint arg_index, void *ptr_buffer) {
+  ::error *kernel__set_arg_mem_buffer(void *ptr_kernel, cl_uint arg_index, void *ptr_buffer) {
     buffer *buf = static_cast<buffer*>(ptr_buffer);
     C_HANDLE_ERROR(
     static_cast<kernel*>(ptr_kernel)->set_arg_mem(arg_index, *buf);
@@ -2162,7 +2162,7 @@ inline event *enqueue_nd_range_kernel(
     return 0;
   }
 
-  void *_enqueue_nd_range_kernel(void **ptr_event, void *ptr_command_queue, void *ptr_kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size) {
+  ::error *_enqueue_nd_range_kernel(void **ptr_event, void *ptr_command_queue, void *ptr_kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size) {
     C_HANDLE_ERROR(
     *ptr_event = enqueue_nd_range_kernel(*static_cast<command_queue*>(ptr_command_queue),
 					 *static_cast<kernel*>(ptr_kernel),
@@ -2175,7 +2175,7 @@ inline event *enqueue_nd_range_kernel(
   }
 
 
-  void *_enqueue_read_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_memory_object_holder, void *buffer, size_t size, size_t device_offset, int is_blocking) {
+  ::error *_enqueue_read_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_memory_object_holder, void *buffer, size_t size, size_t device_offset, int is_blocking) {
     C_HANDLE_ERROR(
     *ptr_event = enqueue_read_buffer(*static_cast<command_queue*>(ptr_command_queue),
 				     *static_cast<memory_object_holder*>(ptr_memory_object_holder),
@@ -2184,7 +2184,7 @@ inline event *enqueue_nd_range_kernel(
     return 0;
   }
   
-  void *memory_object_holder__get_info(void *ptr_memory_object_holder, cl_mem_info param, generic_info *out) {
+  ::error *memory_object_holder__get_info(void *ptr_memory_object_holder, cl_mem_info param, generic_info *out) {
     C_HANDLE_ERROR(
     *out = static_cast<memory_object_holder*>(ptr_memory_object_holder)->get_info(param);
 		   )
diff --git a/src/c_wrapper/wrap_cl_core.h b/src/c_wrapper/wrap_cl_core.h
index c109c9a1..0a35b584 100644
--- a/src/c_wrapper/wrap_cl_core.h
+++ b/src/c_wrapper/wrap_cl_core.h
@@ -22,32 +22,32 @@ typedef struct {
 } error;
 
 int get_cl_version(void);
-void *get_platforms(void **ptr_platforms, uint32_t *num_platforms);
-void *platform__get_info(void *ptr_platform, cl_platform_info param_name, generic_info *out);
-void *platform__get_devices(void *ptr_platform, void **ptr_devices, uint32_t *num_devices, cl_device_type devtype);
+error *get_platforms(void **ptr_platforms, uint32_t *num_platforms);
+error *platform__get_info(void *ptr_platform, cl_platform_info param_name, generic_info *out);
+error *platform__get_devices(void *ptr_platform, void **ptr_devices, uint32_t *num_devices, cl_device_type devtype);
 long platform__hash(void *ptr_platform);
-void *device__get_info(void *ptr_device, cl_device_info param_name, generic_info *out);
+error *device__get_info(void *ptr_device, cl_device_info param_name, generic_info *out);
 long device__hash(void *ptr_device);
 long context__hash(void *ptr_context);
 long command_queue__hash(void *ptr_command_queue);
 long event__hash(void *ptr_event);
-void *_create_context(void **ptr_ctx, cl_context_properties *properties, cl_uint num_devices, void **ptr_devices);
-void *_create_command_queue(void **ptr_command_queue, void *ptr_context, void *ptr_device, cl_command_queue_properties properties);
-void *_create_buffer(void **ptr_buffer, void *ptr_context, cl_mem_flags flags, size_t size, void *hostbuf);
-void *_create_program_with_source(void **ptr_program, void *ptr_context, char *src);
-void *_create_program_with_binary(void **ptr_program, void *ptr_context, cl_uint num_devices, void **ptr_devices, cl_uint num_binaries, char **binaries);
+error *_create_context(void **ptr_ctx, cl_context_properties *properties, cl_uint num_devices, void **ptr_devices);
+error *_create_command_queue(void **ptr_command_queue, void *ptr_context, void *ptr_device, cl_command_queue_properties properties);
+error *_create_buffer(void **ptr_buffer, void *ptr_context, cl_mem_flags flags, size_t size, void *hostbuf);
+error *_create_program_with_source(void **ptr_program, void *ptr_context, char *src);
+error *_create_program_with_binary(void **ptr_program, void *ptr_context, cl_uint num_devices, void **ptr_devices, cl_uint num_binaries, char **binaries);
 error *program__build(void *ptr_program, char *options, cl_uint num_devices, void **ptr_devices);
-void *program__kind(void *ptr_program, int *kind);
-void *program__get_info__devices(void *ptr_program, void **ptr_devices, uint32_t *num_devices);
-void *program__get_info__binaries(void *ptr_program, char ***ptr_binaries, uint32_t *num_binaries);
+error *program__kind(void *ptr_program, int *kind);
+error *program__get_info__devices(void *ptr_program, void **ptr_devices, uint32_t *num_devices);
+error *program__get_info__binaries(void *ptr_program, char ***ptr_binaries, uint32_t *num_binaries);
 long program__hash(void *ptr_program);
-void *_create_kernel(void **ptr_kernel, void *ptr_program, char *name);
-void *kernel__get_info(void *ptr_kernel, cl_kernel_info param, generic_info *out);
-void *kernel__set_arg_mem_buffer(void *ptr_kernel, cl_uint arg_index, void *ptr_buffer);
+error *_create_kernel(void **ptr_kernel, void *ptr_program, char *name);
+error *kernel__get_info(void *ptr_kernel, cl_kernel_info param, generic_info *out);
+error *kernel__set_arg_mem_buffer(void *ptr_kernel, cl_uint arg_index, void *ptr_buffer);
 long kernel__hash(void *ptr_kernel);
-void *_enqueue_nd_range_kernel(void **ptr_event, void *ptr_command_queue, void *ptr_kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size);
-void *_enqueue_read_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_memory_object_holder, void *buffer, size_t size, size_t device_offset, int is_blocking);
-void *memory_object_holder__get_info(void *ptr_memory_object_holder, cl_mem_info param, generic_info *out);
+error *_enqueue_nd_range_kernel(void **ptr_event, void *ptr_command_queue, void *ptr_kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size);
+error *_enqueue_read_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_memory_object_holder, void *buffer, size_t size, size_t device_offset, int is_blocking);
+error *memory_object_holder__get_info(void *ptr_memory_object_holder, cl_mem_info param, generic_info *out);
 long memory_object_holder__hash(void *ptr_memory_object_holder);
 void populate_constants(void(*add)(const char*, const char*, long value));
 void _free(void*);
-- 
GitLab