From db097e0d93bb096213806a97968f5b37255a70a6 Mon Sep 17 00:00:00 2001
From: Yichao Yu <yyc1992@gmail.com>
Date: Fri, 23 May 2014 22:14:32 -0400
Subject: [PATCH] clean up, consistent naming

---
 pyopencl/_cffi.py                    |    4 +-
 pyopencl/c_wrapper/wrap_cl_core.h    |  217 ++--
 pyopencl/c_wrapper/wrap_cl_gl_core.h |   19 +-
 pyopencl/cffi_cl.py                  |  224 ++---
 pyopencl/tools.py                    |    2 +-
 src/c_wrapper/bitlog.cpp             |   71 +-
 src/c_wrapper/bitlog.h               |   40 -
 src/c_wrapper/error.h                |   12 +-
 src/c_wrapper/wrap_cl.cpp            | 1394 ++++++++++++--------------
 9 files changed, 881 insertions(+), 1102 deletions(-)
 delete mode 100644 src/c_wrapper/bitlog.h

diff --git a/pyopencl/_cffi.py b/pyopencl/_cffi.py
index 8c12c497..b505369e 100644
--- a/pyopencl/_cffi.py
+++ b/pyopencl/_cffi.py
@@ -160,9 +160,9 @@ def _import_library():
 
 _lib = _import_library()
 
-if _lib.pyopencl_have_gl():
+if _lib.have_gl():
     _ffi.cdef(_get_wrap_header("wrap_cl_gl_core.h"))
 
 import gc
 _gc_collect = _ffi.callback('int(void)')(gc.collect)
-_lib.pyopencl_set_gc(_gc_collect)
+_lib.set_gc(_gc_collect)
diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h
index 45c9a3fd..26b78dd7 100644
--- a/pyopencl/c_wrapper/wrap_cl_core.h
+++ b/pyopencl/c_wrapper/wrap_cl_core.h
@@ -1,144 +1,149 @@
-// Everything in here should have a 'pyopencl_' prefix to avoid clashing with
-// other libraries imported via CFFI.
+// Interface between C and Python
 
-typedef enum { KND_UNKNOWN, KND_SOURCE, KND_BINARY } program_kind_type;
+// Types
+typedef enum {
+    KND_UNKNOWN,
+    KND_SOURCE,
+    KND_BINARY
+} program_kind_type;
 
 typedef struct {
-  const char *routine;
-  const char *msg;
-  cl_int code;
-  int other;
+    const char *routine;
+    const char *msg;
+    cl_int code;
+    int other;
 } error;
 
 typedef enum {
-  CLASS_NONE,
-  CLASS_PLATFORM,
-  CLASS_DEVICE,
-  CLASS_KERNEL,
-  CLASS_CONTEXT,
-  CLASS_BUFFER,
-  CLASS_PROGRAM,
-  CLASS_EVENT,
-  CLASS_COMMAND_QUEUE,
-  CLASS_GL_BUFFER,
-  CLASS_GL_RENDERBUFFER,
-  CLASS_IMAGE,
-  CLASS_SAMPLER
+    CLASS_NONE,
+    CLASS_PLATFORM,
+    CLASS_DEVICE,
+    CLASS_KERNEL,
+    CLASS_CONTEXT,
+    CLASS_BUFFER,
+    CLASS_PROGRAM,
+    CLASS_EVENT,
+    CLASS_COMMAND_QUEUE,
+    CLASS_GL_BUFFER,
+    CLASS_GL_RENDERBUFFER,
+    CLASS_IMAGE,
+    CLASS_SAMPLER
 } class_t;
 
-
 typedef struct {
-  class_t opaque_class;
-  const char *type;
-  void *value;
-  int dontfree;
+    class_t opaque_class;
+    const char *type;
+    void *value;
+    int dontfree;
 } generic_info;
 
 
-int pyopencl_get_cl_version();
+// Generic functions
+int get_cl_version();
+void free_pointer(void*);
+void free_pointer_array(void**, uint32_t size);
+void set_gc(int (*func)());
+int have_gl();
+
+unsigned bitlog2(unsigned long v);
+void populate_constants(void(*add)(const char*, const char*, long value));
 
+// Platform
 error *get_platforms(clobj_t **ptr_platforms, uint32_t *num_platforms);
 error *platform__get_devices(clobj_t platform, clobj_t **ptr_devices,
                              uint32_t *num_devices, cl_device_type devtype);
-error *_create_context(clobj_t *ctx, const cl_context_properties *properties,
-                       cl_uint num_devices, const clobj_t *ptr_devices);
-error *_create_command_queue(clobj_t *queue, clobj_t context, clobj_t device,
-                             cl_command_queue_properties properties);
-error *_create_buffer(clobj_t *buffer, clobj_t context, cl_mem_flags flags,
-                      size_t size, void *hostbuf);
-error *_create_program_with_source(clobj_t *program, clobj_t context,
-                                   const char *src);
-error *_create_program_with_binary(clobj_t *program, clobj_t context,
-                                   cl_uint num_devices, const clobj_t *devices,
-                                   cl_uint num_binaries, char **binaries,
-                                   size_t *binary_sizes);
+// Context
+error *create_context(clobj_t *ctx, const cl_context_properties *properties,
+                      cl_uint num_devices, const clobj_t *ptr_devices);
+error *context__get_supported_image_formats(clobj_t context, cl_mem_flags flags,
+                                            cl_mem_object_type image_type,
+                                            generic_info *out);
+// Command Queue
+error *create_command_queue(clobj_t *queue, clobj_t context, clobj_t device,
+                            cl_command_queue_properties properties);
+error *command_queue__finish(clobj_t queue);
+error *command_queue__flush(clobj_t queue);
+// Buffer
+error *create_buffer(clobj_t *buffer, clobj_t context, cl_mem_flags flags,
+                     size_t size, void *hostbuf);
+// Memory Object
+error *memory_object__release(clobj_t obj);
+// Program
+error *create_program_with_source(clobj_t *program, clobj_t context,
+                                  const char *src);
+error *create_program_with_binary(clobj_t *program, clobj_t context,
+                                  cl_uint num_devices, const clobj_t *devices,
+                                  char **binaries, size_t *binary_sizes);
 error *program__build(clobj_t program, const char *options,
                       cl_uint num_devices, const clobj_t *devices);
 error *program__kind(clobj_t program, int *kind);
 error *program__get_build_info(clobj_t program, clobj_t device,
                                cl_program_build_info param, generic_info *out);
-
-error *_create_sampler(clobj_t *sampler, clobj_t context,
-                       int normalized_coordinates, cl_addressing_mode am,
-                       cl_filter_mode fm);
-
-error *event__get_profiling_info(clobj_t event, cl_profiling_info param,
-                                 generic_info *out);
-error *event__wait(clobj_t event);
-
-error *_create_kernel(clobj_t *kernel, clobj_t program, const char *name);
+// Sampler
+error *create_sampler(clobj_t *sampler, clobj_t context, int norm_coords,
+                      cl_addressing_mode am, cl_filter_mode fm);
+// Kernel
+error *create_kernel(clobj_t *kernel, clobj_t program, const char *name);
 error *kernel__set_arg_null(clobj_t kernel, cl_uint arg_index);
 error *kernel__set_arg_mem(clobj_t kernel, cl_uint arg_index, clobj_t mem);
 error *kernel__set_arg_sampler(clobj_t kernel, cl_uint arg_index,
                                clobj_t sampler);
 error *kernel__set_arg_buf(clobj_t kernel, cl_uint arg_index,
                            const void *buffer, size_t size);
-
 error *kernel__get_work_group_info(clobj_t kernel,
                                    cl_kernel_work_group_info param,
                                    clobj_t device, generic_info *out);
-
-error *_get_supported_image_formats(clobj_t context, cl_mem_flags flags,
-                                    cl_mem_object_type image_type,
-                                    generic_info *out);
-
-error *_create_image_2d(clobj_t *image, clobj_t context, cl_mem_flags flags,
-                        cl_image_format *fmt, size_t width, size_t height,
-                        size_t pitch, void *buffer, size_t size);
-error *_create_image_3d(clobj_t *image, clobj_t context, cl_mem_flags flags,
-                        cl_image_format *fmt, size_t width, size_t height,
-                        size_t depth, size_t pitch_x, size_t pitch_y,
-                        void *buffer, size_t size);
+// Image
+error *create_image_2d(clobj_t *image, clobj_t context, cl_mem_flags flags,
+                       cl_image_format *fmt, size_t width, size_t height,
+                       size_t pitch, void *buffer);
+error *create_image_3d(clobj_t *image, clobj_t context, cl_mem_flags flags,
+                       cl_image_format *fmt, size_t width, size_t height,
+                       size_t depth, size_t pitch_x, size_t pitch_y,
+                       void *buffer);
 error *image__get_image_info(clobj_t image, cl_image_info param,
                              generic_info *out);
-
-error *_enqueue_nd_range_kernel(clobj_t *ptr_event, clobj_t queue,
-                                clobj_t kernel, cl_uint work_dim,
-                                const size_t *global_work_offset,
-                                const size_t *global_work_size,
-                                const size_t *local_work_size,
-                                const clobj_t *wait_for, uint32_t num_wait_for);
-
-error *_enqueue_marker_with_wait_list(clobj_t *ptr_event, clobj_t queue,
+// Event
+error *event__get_profiling_info(clobj_t event, cl_profiling_info param,
+                                 generic_info *out);
+error *event__wait(clobj_t event);
+// enqueue_*
+error *enqueue_nd_range_kernel(clobj_t *event, clobj_t queue,
+                               clobj_t kernel, cl_uint work_dim,
+                               const size_t *global_work_offset,
+                               const size_t *global_work_size,
+                               const size_t *local_work_size,
+                               const clobj_t *wait_for, uint32_t num_wait_for);
+error *enqueue_marker_with_wait_list(clobj_t *event, clobj_t queue,
+                                     const clobj_t *wait_for,
+                                     uint32_t num_wait_for);
+error *enqueue_barrier_with_wait_list(clobj_t *event, clobj_t queue,
                                       const clobj_t *wait_for,
                                       uint32_t num_wait_for);
-error *_enqueue_barrier_with_wait_list(clobj_t *event, clobj_t queue,
-                                       const clobj_t *wait_for,
-                                       uint32_t num_wait_for);
-error *_enqueue_marker(clobj_t *event, clobj_t queue);
-error *_enqueue_barrier(clobj_t queue);
-error *_enqueue_read_buffer(clobj_t *event, clobj_t queue, clobj_t mem,
-                            void *buffer, size_t size, size_t device_offset,
-                            const clobj_t *wait_for, uint32_t num_wait_for,
-                            int is_blocking);
-error *_enqueue_copy_buffer(clobj_t *event, clobj_t queue, clobj_t src,
-                            clobj_t dst, ptrdiff_t byte_count,
-                            size_t src_offset, size_t dst_offset,
-                            const clobj_t *wait_for, uint32_t num_wait_for);
-error *_enqueue_write_buffer(clobj_t *event, clobj_t queue, clobj_t mem,
-                             const void *buffer, size_t size,
-                             size_t device_offset, const clobj_t *wait_for,
-                             uint32_t num_wait_for, int is_blocking);
-error *_enqueue_read_image(clobj_t *event, clobj_t queue, clobj_t mem,
-                           size_t *origin, size_t *region, void *buffer,
-                           size_t size, size_t row_pitch, size_t slice_pitch,
+error *enqueue_marker(clobj_t *event, clobj_t queue);
+error *enqueue_barrier(clobj_t queue);
+
+error *enqueue_read_buffer(clobj_t *event, clobj_t queue, clobj_t mem,
+                           void *buffer, size_t size, size_t device_offset,
                            const clobj_t *wait_for, uint32_t num_wait_for,
                            int is_blocking);
+error *enqueue_copy_buffer(clobj_t *event, clobj_t queue, clobj_t src,
+                           clobj_t dst, ptrdiff_t byte_count,
+                           size_t src_offset, size_t dst_offset,
+                           const clobj_t *wait_for, uint32_t num_wait_for);
+error *enqueue_write_buffer(clobj_t *event, clobj_t queue, clobj_t mem,
+                            const void *buffer, size_t size,
+                            size_t device_offset, const clobj_t *wait_for,
+                            uint32_t num_wait_for, int is_blocking);
+
+error *enqueue_read_image(clobj_t *event, clobj_t queue, clobj_t mem,
+                          size_t *origin, size_t *region, void *buffer,
+                          size_t row_pitch, size_t slice_pitch,
+                          const clobj_t *wait_for, uint32_t num_wait_for,
+                          int is_blocking);
+// CL Object
+intptr_t clobj__int_ptr(clobj_t obj);
+error *clobj__get_info(clobj_t obj, cl_uint param, generic_info *out);
+void clobj__delete(clobj_t obj);
 
-error *_command_queue_finish(clobj_t queue);
-error *_command_queue_flush(clobj_t queue);
-
-intptr_t _int_ptr(clobj_t obj);
 error *_from_int_ptr(clobj_t *ptr_out, intptr_t int_ptr_value, class_t);
-error *_get_info(clobj_t obj, cl_uint param, generic_info *out);
-void _delete(clobj_t obj);
-error *_release_memobj(clobj_t obj);
-
-void pyopencl_free_pointer(void*);
-void pyopencl_free_pointer_array(void**, uint32_t size);
-
-int pyopencl_have_gl();
-
-unsigned pyopencl_bitlog2(unsigned long v);
-void pyopencl_set_gc(int (*func)());
-void populate_constants(void(*add)(const char*, const char*, long value));
diff --git a/pyopencl/c_wrapper/wrap_cl_gl_core.h b/pyopencl/c_wrapper/wrap_cl_gl_core.h
index 2d34d9e2..bacfdda5 100644
--- a/pyopencl/c_wrapper/wrap_cl_gl_core.h
+++ b/pyopencl/c_wrapper/wrap_cl_gl_core.h
@@ -1,13 +1,12 @@
-// Everything in here should have a 'pyopencl_' prefix to avoid clashing with
-// other libraries imported via CFFI.
+// Interface between C and Python for GL related functions
 
-error *_create_from_gl_buffer(clobj_t *ptr, clobj_t context,
-                              cl_mem_flags flags, GLuint bufobj);
-error *_create_from_gl_renderbuffer(clobj_t *ptr, clobj_t context,
-                                    cl_mem_flags flags, GLuint bufobj);
-error *_enqueue_acquire_gl_objects(
-    clobj_t *ptr_event, clobj_t queue, const clobj_t *mem_objects,
+error *create_from_gl_buffer(clobj_t *ptr, clobj_t context,
+                             cl_mem_flags flags, GLuint bufobj);
+error *create_from_gl_renderbuffer(clobj_t *ptr, clobj_t context,
+                                   cl_mem_flags flags, GLuint bufobj);
+error *enqueue_acquire_gl_objects(
+    clobj_t *event, clobj_t queue, const clobj_t *mem_objects,
     uint32_t num_mem_objects, const clobj_t *wait_for, uint32_t num_wait_for);
-error *_enqueue_release_gl_objects(
-    clobj_t *ptr_event, clobj_t queue, const clobj_t *mem_objects,
+error *enqueue_release_gl_objects(
+    clobj_t *event, clobj_t queue, const clobj_t *mem_objects,
     uint32_t num_mem_objects, const clobj_t *wait_for, uint32_t num_wait_for);
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 3a048c70..3d8728b2 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -76,7 +76,7 @@ class _CArray(object):
 
     def __del__(self):
         if self.ptr != _ffi.NULL:
-            _lib.pyopencl_free_pointer(self.ptr[0])
+            _lib.free_pointer(self.ptr[0])
 
     def __getitem__(self, key):
         return self.ptr[0].__getitem__(key)
@@ -88,7 +88,7 @@ class _CArray(object):
 
 class _CArrays(_CArray):
     def __del__(self):
-        _lib.pyopencl_free_pointer_array(
+        _lib.free_pointer_array(
                 _ffi.cast('void**', self.ptr[0]), self.size[0])
         super(_CArrays, self).__del__()
 
@@ -125,7 +125,7 @@ def _generic_info_to_python(info):
 
         if type_.endswith(']'):
             ret = map(ci, value)
-            _lib.pyopencl_free_pointer(info.value)
+            _lib.free_pointer(info.value)
             return ret
         else:
             return ci(value)
@@ -135,9 +135,7 @@ def _generic_info_to_python(info):
             ret = ret.decode()
     elif type_.startswith('char*['):
         ret = map(_ffi.string, value)
-        if sys.version_info >= (3,):
-            ret = [s.decode() for s in ret]
-        _lib.pyopencl_free_pointer_array(info.value, len(value))
+        _lib.free_pointer_array(info.value, len(value))
     elif type_.endswith(']'):
         if type_.startswith('char['):
             # This is usually a CL binary, which may contain NUL characters
@@ -150,17 +148,15 @@ def _generic_info_to_python(info):
         elif type_.startswith('generic_info['):
             ret = list(map(_generic_info_to_python, value))
         elif type_.startswith('cl_image_format['):
-            ret = [
-                    ImageFormat(
-                        imf.image_channel_order,
-                        imf.image_channel_data_type)
-                    for imf in value]
+            ret = [ImageFormat(imf.image_channel_order,
+                               imf.image_channel_data_type)
+                   for imf in value]
         else:
             ret = list(value)
     else:
         ret = value[0]
     if info.dontfree == 0:
-        _lib.pyopencl_free_pointer(info.value)
+        _lib.free_pointer(info.value)
     return ret
 
 # }}}
@@ -184,26 +180,26 @@ class _Common(object):
     ptr = _ffi.NULL
 
     def __del__(self):
-        _lib._delete(self.ptr)
+        _lib.clobj__delete(self.ptr)
 
     def __eq__(self, other):
         return other == self.int_ptr
 
     def __hash__(self):
-        return _lib._int_ptr(self.ptr)
+        return _lib.clobj__int_ptr(self.ptr)
 
     def get_info(self, param):
         info = _ffi.new('generic_info*')
-        _handle_error(_lib._get_info(self.ptr, param, info))
+        _handle_error(_lib.clobj__get_info(self.ptr, param, info))
         return _generic_info_to_python(info)
 
     @property
     def int_ptr(self):
-        return _lib._int_ptr(self.ptr)
+        return _lib.clobj__int_ptr(self.ptr)
 
     @classmethod
     def from_int_ptr(cls, int_ptr_value):
-        ptr = _ffi.new('void **')
+        ptr = _ffi.new('clobj_t*')
         _handle_error(_lib._from_int_ptr(
             ptr, int_ptr_value, getattr(_lib, 'CLASS_%s' % cls._id.upper())))
         return _create_instance(cls, ptr[0])
@@ -214,9 +210,9 @@ class _Common(object):
 
 
 def get_cl_header_version():
-    v = _lib.pyopencl_get_cl_version()
-    return (v >> (3*4),
-            (v >> (1*4)) & 0xff)
+    v = _lib.get_cl_version()
+    return (v >> (3 * 4),
+            (v >> (1 * 4)) & 0xff)
 
 
 # {{{ constants
@@ -312,8 +308,8 @@ def _handle_error(error):
         # non-pyopencl exceptions are handled here
         import exceptions
         e = exceptions.RuntimeError(_ffi.string(error.msg))
-        _lib.pyopencl_free_pointer(error.msg)
-        _lib.pyopencl_free_pointer(error)
+        _lib.free_pointer(error.msg)
+        _lib.free_pointer(error)
         raise e
     if error.code == status_code.MEM_OBJECT_ALLOCATION_FAILURE:
         klass = MemoryError
@@ -326,9 +322,9 @@ def _handle_error(error):
 
     e = klass(routine=_ffi.string(error.routine),
             code=error.code, msg=_ffi.string(error.msg))
-    _lib.pyopencl_free_pointer(error.routine)
-    _lib.pyopencl_free_pointer(error.msg)
-    _lib.pyopencl_free_pointer(error)
+    _lib.free_pointer(error.routine)
+    _lib.free_pointer(error.msg)
+    _lib.free_pointer(error)
     raise e
 
 # }}}
@@ -440,7 +436,7 @@ class Context(_Common):
                         "one of 'devices' or 'dev_type' must be None")
             ptr_devices = _ffi.new('void*[]', [device.ptr for device in devices])
             ptr_ctx = _ffi.new('void **')
-            _handle_error(_lib._create_context(
+            _handle_error(_lib.create_context(
                 ptr_ctx, c_props, len(ptr_devices),
                 _ffi.cast('void**', ptr_devices)))
 
@@ -463,15 +459,15 @@ class CommandQueue(_Common):
 
         ptr_command_queue = _ffi.new('void **')
 
-        _handle_error(_lib._create_command_queue(
+        _handle_error(_lib.create_command_queue(
             ptr_command_queue, context.ptr,
             _ffi.NULL if device is None else device.ptr, properties))
 
         self.ptr = ptr_command_queue[0]
     def finish(self):
-        _handle_error(_lib._command_queue_finish(self.ptr))
+        _handle_error(_lib.command_queue__finish(self.ptr))
     def flush(self):
-        _handle_error(_lib._command_queue_flush(self.ptr))
+        _handle_error(_lib.command_queue__flush(self.ptr))
 
 class MemoryObjectHolder(_Common):
     pass
@@ -479,7 +475,7 @@ class MemoryObjectHolder(_Common):
 
 class MemoryObject(MemoryObjectHolder):
     def release(self):
-        _handle_error(_lib._release_memobj(self.ptr))
+        _handle_error(_lib.memory_object__release(self.ptr))
 
 def _c_buffer_from_obj(obj, writable=False):
     """Convert a Python object to a tuple (cdata('void *'), num_bytes, dummy)
@@ -571,7 +567,7 @@ class Buffer(MemoryObject):
                 size = hostbuf_size
 
         ptr_buffer = _ffi.new('void **')
-        _handle_error(_lib._create_buffer(
+        _handle_error(_lib.create_buffer(
             ptr_buffer, context.ptr, flags, size, c_hostbuf))
         self.ptr = ptr_buffer[0]
 
@@ -591,7 +587,7 @@ class _Program(_Common):
 
     def _init_source(self, context, src):
         ptr_program = _ffi.new('void **')
-        _handle_error(_lib._create_program_with_source(
+        _handle_error(_lib.create_program_with_source(
             ptr_program, context.ptr, _convert_str(src)))
         self.ptr = ptr_program[0]
 
@@ -604,17 +600,12 @@ class _Program(_Common):
         ptr_program = _ffi.new('void **')
         ptr_devices = _ffi.new('void*[]', [device.ptr for device in devices])
         ptr_binaries = [_ffi.new('char[%i]' % len(binary), binary)
-                for binary in binaries]
+                        for binary in binaries]
         binary_sizes = _ffi.new('size_t[]', map(len, binaries))
 
-        _handle_error(_lib._create_program_with_binary(
-            ptr_program,
-            context.ptr,
-            len(ptr_devices),
-            ptr_devices,
-            len(ptr_binaries),
-            _ffi.new('char*[]', ptr_binaries),
-            binary_sizes))
+        _handle_error(_lib.create_program_with_binary(
+            ptr_program, context.ptr, len(ptr_devices), ptr_devices,
+            _ffi.new('char*[]', ptr_binaries), binary_sizes))
 
         self.ptr = ptr_program[0]
 
@@ -655,8 +646,8 @@ class Kernel(_Common):
 
     def __init__(self, program, name):
         ptr_kernel = _ffi.new('void **')
-        _handle_error(_lib._create_kernel(ptr_kernel, program.ptr,
-                                          _convert_str(name)))
+        _handle_error(_lib.create_kernel(ptr_kernel, program.ptr,
+                                         _convert_str(name)))
         self.ptr = ptr_kernel[0]
 
     def set_arg(self, arg_index, arg):
@@ -741,16 +732,9 @@ def enqueue_nd_range_kernel(queue, kernel,
 
     ptr_event = _ffi.new('void **')
     c_wait_for, num_wait_for = _c_obj_list(wait_for)
-    _handle_error(_lib._enqueue_nd_range_kernel(
-        ptr_event,
-        queue.ptr,
-        kernel.ptr,
-        work_dim,
-        c_global_work_offset,
-        c_global_work_size,
-        c_local_work_size,
-        c_wait_for, num_wait_for
-    ))
+    _handle_error(_lib.enqueue_nd_range_kernel(
+        ptr_event, queue.ptr, kernel.ptr, work_dim, c_global_work_offset,
+        c_global_work_size, c_local_work_size, c_wait_for, num_wait_for))
     return _create_instance(Event, ptr_event[0])
 
 # }}}
@@ -760,15 +744,13 @@ def enqueue_nd_range_kernel(queue, kernel,
 def _enqueue_marker_with_wait_list(queue, wait_for=None):
     ptr_event = _ffi.new('void **')
     c_wait_for, num_wait_for = _c_obj_list(wait_for)
-    _handle_error(_lib._enqueue_marker_with_wait_list(
-        ptr_event,
-        queue.ptr,
-        c_wait_for, num_wait_for))
+    _handle_error(_lib.enqueue_marker_with_wait_list(
+        ptr_event, queue.ptr, c_wait_for, num_wait_for))
     return _create_instance(Event, ptr_event[0])
 
 def _enqueue_marker(queue):
     ptr_event = _ffi.new('void **')
-    _handle_error(_lib._enqueue_marker(ptr_event, queue.ptr))
+    _handle_error(_lib.enqueue_marker(ptr_event, queue.ptr))
     return _create_instance(Event, ptr_event[0])
 
 # }}}
@@ -778,14 +760,12 @@ def _enqueue_marker(queue):
 def _enqueue_barrier_with_wait_list(queue, wait_for=None):
     ptr_event = _ffi.new('void **')
     c_wait_for, num_wait_for = _c_obj_list(wait_for)
-    _handle_error(_lib._enqueue_barrier_with_wait_list(
-        ptr_event,
-        queue.ptr,
-        c_wait_for, num_wait_for))
+    _handle_error(_lib.enqueue_barrier_with_wait_list(
+        ptr_event, queue.ptr, c_wait_for, num_wait_for))
     return _create_instance(Event, ptr_event[0])
 
 def _enqueue_barrier(queue):
-    _handle_error(_lib._enqueue_barrier(queue.ptr))
+    _handle_error(_lib.enqueue_barrier(queue.ptr))
 
 # }}}
 
@@ -796,16 +776,9 @@ def _enqueue_read_buffer(queue, mem, hostbuf, device_offset=0,
     c_buf, size, _ = _c_buffer_from_obj(hostbuf, writable=True)
     ptr_event = _ffi.new('void **')
     c_wait_for, num_wait_for = _c_obj_list(wait_for)
-    _handle_error(_lib._enqueue_read_buffer(
-        ptr_event,
-        queue.ptr,
-        mem.ptr,
-        c_buf,
-        size,
-        device_offset,
-        c_wait_for, num_wait_for,
-        bool(is_blocking)
-    ))
+    _handle_error(_lib.enqueue_read_buffer(
+        ptr_event, queue.ptr, mem.ptr, c_buf, size, device_offset,
+        c_wait_for, num_wait_for, bool(is_blocking)))
     return _create_instance(Event, ptr_event[0])
 
 
@@ -813,16 +786,9 @@ def _enqueue_copy_buffer(queue, src, dst, byte_count=-1, src_offset=0,
         dst_offset=0, wait_for=None):
     ptr_event = _ffi.new('void **')
     c_wait_for, num_wait_for = _c_obj_list(wait_for)
-    _handle_error(_lib._enqueue_copy_buffer(
-        ptr_event,
-        queue.ptr,
-        src.ptr,
-        dst.ptr,
-        byte_count,
-        src_offset,
-        dst_offset,
-        c_wait_for, num_wait_for,
-    ))
+    _handle_error(_lib.enqueue_copy_buffer(
+        ptr_event, queue.ptr, src.ptr, dst.ptr, byte_count, src_offset,
+        dst_offset, c_wait_for, num_wait_for))
     return _create_instance(Event, ptr_event[0])
 
 
@@ -831,16 +797,9 @@ def _enqueue_write_buffer(queue, mem, hostbuf, device_offset=0,
     c_buf, size, _ = _c_buffer_from_obj(hostbuf)
     ptr_event = _ffi.new('void **')
     c_wait_for, num_wait_for = _c_obj_list(wait_for)
-    _handle_error(_lib._enqueue_write_buffer(
-        ptr_event,
-        queue.ptr,
-        mem.ptr,
-        c_buf,
-        size,
-        device_offset,
-        c_wait_for, num_wait_for,
-        bool(is_blocking)
-    ))
+    _handle_error(_lib.enqueue_write_buffer(
+        ptr_event, queue.ptr, mem.ptr, c_buf, size, device_offset,
+        c_wait_for, num_wait_for, bool(is_blocking)))
     return _create_instance(Event, ptr_event[0])
 
 # }}}
@@ -848,23 +807,15 @@ def _enqueue_write_buffer(queue, mem, hostbuf, device_offset=0,
 
 # {{{ _enqueue_*_image
 
-def _enqueue_read_image(queue, mem, origin, region,
-        hostbuf, row_pitch=0, slice_pitch=0, wait_for=None, is_blocking=True):
+def _enqueue_read_image(queue, mem, origin, region, hostbuf, row_pitch=0,
+                        slice_pitch=0, wait_for=None, is_blocking=True):
     c_buf, size, _ = _c_buffer_from_obj(hostbuf, writable=True)
     ptr_event = _ffi.new('void **')
     c_wait_for, num_wait_for = _c_obj_list(wait_for)
-    _handle_error(_lib._enqueue_read_image(
-        ptr_event,
-        queue.ptr,
-        mem.ptr,
-        origin,
-        region,
-        c_buf,
-        size,
-        row_pitch, slice_pitch,
-        c_wait_for, num_wait_for,
-        bool(is_blocking)
-    ))
+    # TODO check buffer size
+    _handle_error(_lib.enqueue_read_image(
+        ptr_event, queue.ptr, mem.ptr, origin, region, c_buf, row_pitch,
+        slice_pitch, c_wait_for, num_wait_for, bool(is_blocking)))
     return _create_instance(Event, ptr_event[0])
 
 # TODO: write_image? copy_image?...
@@ -875,7 +826,7 @@ def _enqueue_read_image(queue, mem, origin, region,
 # {{{ gl interop
 
 def have_gl():
-    return bool(_lib.pyopencl_have_gl())
+    return bool(_lib.have_gl())
 
 
 class GLBuffer(MemoryObject):
@@ -883,7 +834,7 @@ class GLBuffer(MemoryObject):
 
     def __init__(self, context, flags, bufobj):
         ptr = _ffi.new('void **')
-        _handle_error(_lib._create_from_gl_buffer(
+        _handle_error(_lib.create_from_gl_buffer(
             ptr, context.ptr, flags, bufobj))
         self.ptr = ptr[0]
 
@@ -893,7 +844,7 @@ class GLRenderBuffer(MemoryObject):
 
     def __init__(self, context, flags, bufobj):
         ptr = _ffi.new('void **')
-        _handle_error(_lib._create_from_gl_renderbuffer(
+        _handle_error(_lib.create_from_gl_renderbuffer(
             ptr, context.ptr, flags, bufobj))
         self.ptr = ptr[0]
 
@@ -914,9 +865,11 @@ def _create_gl_enqueue(what):
         return _create_instance(Event, ptr_event[0])
     return enqueue_gl_objects
 
-if _lib.pyopencl_have_gl():
-    enqueue_acquire_gl_objects = _create_gl_enqueue(_lib._enqueue_acquire_gl_objects)
-    enqueue_release_gl_objects = _create_gl_enqueue(_lib._enqueue_release_gl_objects)
+if _lib.have_gl():
+    enqueue_acquire_gl_objects = _create_gl_enqueue(
+        _lib.enqueue_acquire_gl_objects)
+    enqueue_release_gl_objects = _create_gl_enqueue(
+        _lib.enqueue_release_gl_objects)
 
 # }}}
 
@@ -1005,7 +958,7 @@ class ImageFormat(object):
 
 def get_supported_image_formats(context, flags, image_type):
     info = _ffi.new('generic_info *')
-    _handle_error(_lib._get_supported_image_formats(
+    _handle_error(_lib.context__get_supported_image_formats(
         context.ptr, flags, image_type, info))
     return _generic_info_to_python(info)
 
@@ -1051,21 +1004,17 @@ class Image(MemoryObject):
                             "invalid length of pitch tuple")
 
             # check buffer size
-            if (buffer is not None
-                    and max(pitch, width*format.itemsize)*height > size):
+            if (buffer is not None and
+                max(pitch, width * format.itemsize) * height > size):
                 raise LogicError("Image", status_code.INVALID_VALUE,
                         "buffer too small")
 
             ptr = _ffi.new('void **')
-            _handle_error(_lib._create_image_2d(
-                ptr,
-                context.ptr,
-                flags,
+            _handle_error(_lib.create_image_2d(
+                ptr, context.ptr, flags,
                 _ffi.new('struct _cl_image_format *',
                     (format.channel_order, format.channel_data_type, )),
-                width, height, pitch,
-                c_buf,
-                size))
+                width, height, pitch, c_buf))
             self.ptr = ptr[0]
         elif dims == 3:
             width, height, depth = shape
@@ -1078,27 +1027,18 @@ class Image(MemoryObject):
                             "invalid length of pitch tuple")
 
             # check buffer size
-            if (buffer is not None
-                    and (
-                        max(
-                            max(
-                                pitch_x,
-                                width*format.itemsize)*height,
-                            pitch_y
-                            ) * depth > size)):
+            if (buffer is not None and
+                (max(max(pitch_x, width * format.itemsize) *
+                     height, pitch_y) * depth > size)):
                 raise LogicError("Image", status_code.INVALID_VALUE,
                     "buffer too small")
 
             ptr = _ffi.new('void **')
-            _handle_error(_lib._create_image_3d(
-                ptr,
-                context.ptr,
-                flags,
+            _handle_error(_lib.create_image_3d(
+                ptr, context.ptr, flags,
                 _ffi.new('struct _cl_image_format *',
                     (format.channel_order, format.channel_data_type, )),
-                width, height, depth, pitch_x, pitch_y,
-                c_buf,
-                size))
+                width, height, depth, pitch_x, pitch_y, c_buf))
 
             self.ptr = ptr[0]
         else:
@@ -1130,12 +1070,8 @@ class Sampler(_Common):
 
     def __init__(self, context, normalized_coords, addressing_mode, filter_mode):
         ptr = _ffi.new('void **')
-        _handle_error(_lib._create_sampler(
-            ptr,
-            context.ptr,
-            normalized_coords,
-            addressing_mode,
-            filter_mode))
+        _handle_error(_lib.create_sampler(
+            ptr, context.ptr, normalized_coords, addressing_mode, filter_mode))
         self.ptr = ptr[0]
 
 # }}}
diff --git a/pyopencl/tools.py b/pyopencl/tools.py
index 71191906..ef67721b 100644
--- a/pyopencl/tools.py
+++ b/pyopencl/tools.py
@@ -64,7 +64,7 @@ _register_types()
 
 # {{{ imported names
 
-bitlog2 = _lib.pyopencl_bitlog2
+bitlog2 = _lib.bitlog2
 from pyopencl.mempool import (  # noqa
         PooledBuffer, DeferredAllocator, ImmediateAllocator, MemoryPool)
 
diff --git a/src/c_wrapper/bitlog.cpp b/src/c_wrapper/bitlog.cpp
index f7951729..da0cb1de 100644
--- a/src/c_wrapper/bitlog.cpp
+++ b/src/c_wrapper/bitlog.cpp
@@ -1,28 +1,57 @@
-#include "bitlog.h"
 #include "wrap_cl.h"
+#include <climits>
+#include <stdint.h>
 
 /* from http://graphics.stanford.edu/~seander/bithacks.html */
-const char pyopencl::log_table_8[] =
-{
-  0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
-  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
+static const char log_table_8[] = {
+    0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
 };
 
-unsigned pyopencl_bitlog2(unsigned long v)
+static inline unsigned
+bitlog2_16(uint16_t v)
+{
+    if (unsigned long t = v >> 8) {
+        return 8 + log_table_8[t];
+    } else {
+        return log_table_8[v];
+    }
+}
+
+static inline unsigned
+bitlog2_32(uint32_t v)
+{
+    if (uint16_t t = v >> 16) {
+        return 16 + bitlog2_16(t);
+    } else {
+      return bitlog2_16(v);
+    }
+}
+
+unsigned
+bitlog2(unsigned long v)
 {
-    return pyopencl::bitlog2(v);
+#if (ULONG_MAX != 4294967295)
+    if (uint32_t t = v >> 32) {
+        return 32 + bitlog2_32(t);
+    } else {
+#endif
+        return bitlog2_32(v);
+#if (ULONG_MAX != 4294967295)
+    }
+#endif
 }
diff --git a/src/c_wrapper/bitlog.h b/src/c_wrapper/bitlog.h
deleted file mode 100644
index fde67e8d..00000000
--- a/src/c_wrapper/bitlog.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Base-2 logarithm bithack.
-
-#ifndef _AFJDFJSDFSD_PYOPENCL_HEADER_SEEN_BITLOG_HPP
-#define _AFJDFJSDFSD_PYOPENCL_HEADER_SEEN_BITLOG_HPP
-
-#include <climits>
-#include <stdint.h>
-
-namespace pyopencl
-{
-  extern const char log_table_8[];
-
-  static inline unsigned bitlog2_16(uint16_t v)
-  {
-    if (unsigned long t = v >> 8)
-      return 8 + log_table_8[t];
-    else
-      return log_table_8[v];
-  }
-
-  static inline unsigned bitlog2_32(uint32_t v)
-  {
-    if (uint16_t t = v >> 16)
-      return 16 + bitlog2_16(t);
-    else
-      return bitlog2_16(v);
-  }
-
-  static inline unsigned bitlog2(unsigned long v)
-  {
-#if (ULONG_MAX != 4294967295)
-    if (uint32_t t = v >> 32)
-      return 32 + bitlog2_32(t);
-    else
-#endif
-      return bitlog2_32(v);
-  }
-}
-
-#endif
diff --git a/src/c_wrapper/error.h b/src/c_wrapper/error.h
index 66039fe1..491b65f2 100644
--- a/src/c_wrapper/error.h
+++ b/src/c_wrapper/error.h
@@ -56,13 +56,13 @@ print_call_trace(ArgTypes&&...)
 
 // {{{ error
 
-class error : public std::runtime_error {
+class clerror : public std::runtime_error {
 private:
     const char *m_routine;
     cl_int m_code;
 
 public:
-    error(const char *rout, cl_int c, const char *msg="")
+    clerror(const char *rout, cl_int c, const char *msg="")
         : std::runtime_error(msg), m_routine(rout), m_code(c)
     {
         std::cout << rout <<";" << msg<< ";" << c << std::endl;
@@ -99,7 +99,7 @@ call_guarded(cl_int (*func)(ArgTypes...), const char *name, ArgTypes2&&... args)
     print_call_trace(name);
     cl_int status_code = func(ArgTypes(args)...);
     if (status_code != CL_SUCCESS) {
-        throw pyopencl::error(name, status_code);
+        throw clerror(name, status_code);
     }
 }
 
@@ -111,7 +111,7 @@ call_guarded(T (*func)(ArgTypes...), const char *name, ArgTypes2&&... args)
     cl_int status_code = CL_SUCCESS;
     T res = func(args..., &status_code);
     if (status_code != CL_SUCCESS) {
-        throw pyopencl::error(name, status_code);
+        throw clerror(name, status_code);
     }
     return res;
 }
@@ -141,7 +141,7 @@ c_handle_error(std::function<void()> func)
     try {
         func();
         return NULL;
-    } catch(const pyopencl::error &e) {
+    } catch(const clerror &e) {
         auto err = (::error*)malloc(sizeof(::error));
         err->routine = strdup(e.routine());
         err->msg = strdup(e.what());
@@ -163,7 +163,7 @@ retry_mem_error(std::function<T()> func)
 {
     try {
         return func();
-    } catch (pyopencl::error &e) {
+    } catch (clerror &e) {
         if (!e.is_out_of_memory() || !python_gc()) {
             throw;
         }
diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp
index 9dbc39b4..f4e6faa8 100644
--- a/src/c_wrapper/wrap_cl.cpp
+++ b/src/c_wrapper/wrap_cl.cpp
@@ -6,23 +6,30 @@
 // {{{ extension function pointers
 
 #if PYOPENCL_CL_VERSION >= 0x1020
-
-#define PYOPENCL_GET_EXT_FUN(PLATFORM, NAME, VAR) \
-  NAME##_fn VAR  = (NAME##_fn) \
-      clGetExtensionFunctionAddressForPlatform(PLATFORM, #NAME); \
-  \
-  if (!VAR) \
-    throw error(#NAME, CL_INVALID_VALUE, #NAME " not available");
-
+template<typename T>
+static inline T
+pyopencl_get_ext_fun(cl_platform_id plat, const char *name, const char *err)
+{
+    T func = (T)clGetExtensionFunctionAddressForPlatform(plat, name);
+    if (!func) {
+        throw pyopencl::clerror(name, CL_INVALID_VALUE, err);
+    }
+    return func;
+}
 #else
-
-#define PYOPENCL_GET_EXT_FUN(PLATFORM, NAME, VAR) \
-  NAME##_fn VAR = (NAME##_fn) clGetExtensionFunctionAddress(#NAME); \
-  \
-  if (!VAR) \
-    throw error(#NAME, CL_INVALID_VALUE, #NAME " not available");
-
+template<typename T>
+static inline T
+pyopencl_get_ext_fun(cl_platform_id, const char *name, const char *err)
+{
+    T func = (T)clGetExtensionFunctionAddress(name);
+    if (!func) {
+        throw pyopencl::clerror(name, CL_INVALID_VALUE, err);
+    }
+    return func;
+}
 #endif
+#define pyopencl_get_ext_fun(plat, name)                                \
+    pyopencl_get_ext_fun<name##_fn>(plat, #name, #name " not available")
 
 // }}}
 
@@ -51,7 +58,7 @@
   case ::CLASS_IMAGE: OPERATION(IMAGE, image); break; \
   case ::CLASS_SAMPLER: OPERATION(SAMPLER, sampler); break; \
   GL_SWITCHCLASS(OPERATION) \
-  default: throw pyopencl::error("unknown class", CL_INVALID_VALUE);    \
+  default: throw pyopencl::clerror("unknown class", CL_INVALID_VALUE);    \
   }
 
 #define PYOPENCL_CL_PLATFORM cl_platform_id
@@ -99,7 +106,7 @@ public:
             return pyopencl_get_str_info(Platform, data(), param_name);
 
         default:
-            throw error("Platform.get_info", CL_INVALID_VALUE);
+            throw clerror("Platform.get_info", CL_INVALID_VALUE);
         }
     }
 
@@ -114,7 +121,7 @@ platform::get_devices(cl_device_type devtype)
     try {
         pyopencl_call_guarded(clGetDeviceIDs,
                               data(), devtype, 0, NULL, &num_devices);
-    } catch (const pyopencl::error &e) {
+    } catch (const clerror &e) {
         if (e.code() != CL_DEVICE_NOT_FOUND)
             throw e;
         num_devices = 0;
@@ -166,8 +173,8 @@ public:
                                       CL_DEVICE_PLATFORM, sizeof(plat),
                                       &plat, NULL);
 #endif
-                PYOPENCL_GET_EXT_FUN(plat, clRetainDeviceEXT, retain_func);
-                pyopencl_call_guarded(retain_func, did);
+                pyopencl_call_guarded(
+                    pyopencl_get_ext_fun(plat, clRetainDeviceEXT), did);
             }
 #endif
 #if PYOPENCL_CL_VERSION >= 0x1020
@@ -177,9 +184,9 @@ public:
 #endif
 
             else {
-                throw error("Device", CL_INVALID_VALUE,
-                            "cannot own references to devices when device "
-                            "fission or CL 1.2 is not available");
+                throw clerror("Device", CL_INVALID_VALUE,
+                              "cannot own references to devices when device "
+                              "fission or CL 1.2 is not available");
             }
         }
     }
@@ -195,8 +202,8 @@ public:
             pyopencl_call_guarded(clGetDeviceInfo, data(), CL_DEVICE_PLATFORM,
                                   sizeof(plat), &plat, NULL);
 #endif
-            PYOPENCL_GET_EXT_FUN(plat, clReleaseDeviceEXT, release_func);
-            pyopencl_call_guarded_cleanup(release_func, data());
+            pyopencl_call_guarded_cleanup(
+                pyopencl_get_ext_fun(plat, clReleaseDeviceEXT), data());
         }
 #endif
 #if PYOPENCL_CL_VERSION >= 0x1020
@@ -418,7 +425,7 @@ public:
             // }}}
 
         default:
-            throw error("Device.get_info", CL_INVALID_VALUE);
+            throw clerror("Device.get_info", CL_INVALID_VALUE);
         }
     }
 
@@ -559,8 +566,8 @@ public:
 
 #endif
                 default:
-                    throw error("Context.get_info", CL_INVALID_VALUE,
-                                "unknown context_property key encountered");
+                    throw clerror("Context.get_info", CL_INVALID_VALUE,
+                                  "unknown context_property key encountered");
                 }
             }
             py_result.resize(i);
@@ -574,9 +581,21 @@ public:
 #endif
 
         default:
-            throw error("Context.get_info", CL_INVALID_VALUE);
+            throw clerror("Context.get_info", CL_INVALID_VALUE);
         }
     }
+    inline generic_info
+    get_supported_image_formats(cl_mem_flags flags,
+                                cl_mem_object_type image_type) const
+    {
+        cl_uint num_image_formats;
+        pyopencl_call_guarded(clGetSupportedImageFormats, data(), flags,
+                              image_type, 0, NULL, &num_image_formats);
+        pyopencl_buf<cl_image_format> formats(num_image_formats);
+        pyopencl_call_guarded(clGetSupportedImageFormats, data(), flags,
+                              image_type, formats.len(), formats.get(), NULL);
+        return pyopencl_convert_array_info(cl_image_format, formats);
+    }
 };
 
 // }}}
@@ -587,8 +606,8 @@ public:
 class command_queue : public clobj<cl_command_queue> {
 private:
     static cl_command_queue
-    create_command_queue(const context *ctx, const device *py_dev,
-                         cl_command_queue_properties props)
+    create_cl_command_queue(const context *ctx, const device *py_dev,
+                            cl_command_queue_properties props)
     {
         cl_device_id dev;
         if (py_dev) {
@@ -597,9 +616,9 @@ private:
             auto devs = pyopencl_get_vec_info(cl_device_id, Context,
                                               ctx->data(), CL_CONTEXT_DEVICES);
             if (devs.len() == 0) {
-                throw pyopencl::error("CommandQueue", CL_INVALID_VALUE,
-                                      "context doesn't have any devices? -- "
-                                      "don't know which one to default to");
+                throw clerror("CommandQueue", CL_INVALID_VALUE,
+                              "context doesn't have any devices? -- "
+                              "don't know which one to default to");
             }
             dev = devs[0];
         }
@@ -617,7 +636,7 @@ public:
     }
     command_queue(const context *ctx, const device *py_dev=0,
                   cl_command_queue_properties props=0)
-        : clobj(create_command_queue(ctx, py_dev, props))
+        : clobj(create_cl_command_queue(ctx, py_dev, props))
     {}
     ~command_queue()
     {
@@ -641,7 +660,7 @@ public:
             return pyopencl_get_int_info(cl_command_queue_properties,
                                          CommandQueue, data(), param_name);
         default:
-            throw error("CommandQueue.get_info", CL_INVALID_VALUE);
+            throw clerror("CommandQueue.get_info", CL_INVALID_VALUE);
         }
     }
 
@@ -715,7 +734,7 @@ public:
 #endif
 
         default:
-            throw error("Event.get_info", CL_INVALID_VALUE);
+            throw clerror("Event.get_info", CL_INVALID_VALUE);
         }
     }
     generic_info
@@ -729,7 +748,7 @@ public:
             return pyopencl_get_int_info(cl_ulong, EventProfiling,
                                          data(), param_name);
         default:
-            throw error("Event.get_profiling_info", CL_INVALID_VALUE);
+            throw clerror("Event.get_profiling_info", CL_INVALID_VALUE);
         }
     }
 
@@ -739,7 +758,6 @@ public:
         pyopencl_call_guarded(clWaitForEvents, 1, &data());
     }
 };
-
 static inline event*
 new_event(cl_event evt)
 {
@@ -775,9 +793,9 @@ public:
         case CL_MEM_SIZE:
             return pyopencl_get_int_info(size_t, MemObject, data(), param_name);
         case CL_MEM_HOST_PTR:
-            throw pyopencl::error("MemoryObject.get_info", CL_INVALID_VALUE,
-                                  "Use MemoryObject.get_host_array to get "
-                                  "host pointer.");
+            throw clerror("MemoryObject.get_info", CL_INVALID_VALUE,
+                          "Use MemoryObject.get_host_array to get "
+                          "host pointer.");
         case CL_MEM_MAP_COUNT:
         case CL_MEM_REFERENCE_COUNT:
             return pyopencl_get_int_info(cl_uint, MemObject,
@@ -805,7 +823,7 @@ public:
 #endif
 
         default:
-            throw error("MemoryObjectHolder.get_info", CL_INVALID_VALUE);
+            throw clerror("MemoryObjectHolder.get_info", CL_INVALID_VALUE);
         }
     }
 };
@@ -816,7 +834,7 @@ private:
     void *m_hostbuf;
 public:
     memory_object(cl_mem mem, bool retain, void *hostbuf=0)
-        : m_valid(true), memory_object_holder(mem)
+        : memory_object_holder(mem), m_valid(true)
     {
         if (retain) {
             pyopencl_call_guarded(clRetainMemObject, mem);
@@ -829,8 +847,8 @@ public:
     release()
     {
         if (!m_valid)
-            throw error("MemoryObject.free", CL_INVALID_VALUE,
-                        "trying to double-unref mem object");
+            throw clerror("MemoryObject.free", CL_INVALID_VALUE,
+                          "trying to double-unref mem object");
         pyopencl_call_guarded_cleanup(clReleaseMemObject, data());
         m_valid = false;
     }
@@ -847,89 +865,87 @@ public:
     }
 };
 
-  // #if PYOPENCL_CL_VERSION >= 0x1020
-  //   inline
-  //   event *enqueue_migrate_mem_objects(
-  //       command_queue &cq,
-  //       py::object py_mem_objects,
-  //       cl_mem_migration_flags flags,
-  //       py::object py_wait_for)
-  //   {
-  //     PYOPENCL_PARSE_WAIT_FOR;
-
-  //     std::vector<cl_mem> mem_objects;
-  //     PYTHON_FOREACH(mo, py_mem_objects)
-  //       mem_objects.push_back(py::extract<memory_object &>(mo)().data());
-
-  //     cl_event evt;
-  //     PYOPENCL_RETRY_IF_MEM_ERROR(
-  //       PYOPENCL_CALL_GUARDED(clEnqueueMigrateMemObjects, (
-  //             cq.data(),
-  //             mem_objects.size(), mem_objects.empty( ) ? NULL : &mem_objects.front(),
-  //             flags,
-  //             PYOPENCL_WAITLIST_ARGS, &evt
-  //             ));
-  //       );
-  //     PYOPENCL_RETURN_NEW_EVENT(evt);
-  //   }
-  // #endif
-
-  // #ifdef cl_ext_migrate_memobject
-  //   inline
-  //   event *enqueue_migrate_mem_object_ext(
-  //       command_queue &cq,
-  //       py::object py_mem_objects,
-  //       cl_mem_migration_flags_ext flags,
-  //       py::object py_wait_for)
-  //   {
-  //     PYOPENCL_PARSE_WAIT_FOR;
-
-  // #if PYOPENCL_CL_VERSION >= 0x1020
-  //     // {{{ get platform
-  //     cl_device_id dev;
-  //     PYOPENCL_CALL_GUARDED(clGetCommandQueueInfo, (cq.data(), CL_QUEUE_DEVICE,
-  //           sizeof(dev), &dev, NULL));
-  //     cl_platform_id plat;
-  //     PYOPENCL_CALL_GUARDED(clGetDeviceInfo, (cq.data(), CL_DEVICE_PLATFORM,
-  //           sizeof(plat), &plat, NULL));
-  //     // }}}
-  // #endif
-
-  //     PYOPENCL_GET_EXT_FUN(plat,
-  //         clEnqueueMigrateMemObjectEXT, enqueue_migrate_fn);
-
-  //     std::vector<cl_mem> mem_objects;
-  //     PYTHON_FOREACH(mo, py_mem_objects)
-  //       mem_objects.push_back(py::extract<memory_object &>(mo)().data());
-
-  //     cl_event evt;
-  //     PYOPENCL_RETRY_IF_MEM_ERROR(
-  //       PYOPENCL_CALL_GUARDED(enqueue_migrate_fn, (
-  //             cq.data(),
-  //             mem_objects.size(), mem_objects.empty( ) ? NULL : &mem_objects.front(),
-  //             flags,
-  //             PYOPENCL_WAITLIST_ARGS, &evt
-  //             ));
-  //       );
-  //     PYOPENCL_RETURN_NEW_EVENT(evt);
-  //   }
-  // #endif
-
-  // }}}
+// #if PYOPENCL_CL_VERSION >= 0x1020
+//   inline
+//   event *enqueue_migrate_mem_objects(
+//       command_queue &cq,
+//       py::object py_mem_objects,
+//       cl_mem_migration_flags flags,
+//       py::object py_wait_for)
+//   {
+//     PYOPENCL_PARSE_WAIT_FOR;
+
+//     std::vector<cl_mem> mem_objects;
+//     PYTHON_FOREACH(mo, py_mem_objects)
+//       mem_objects.push_back(py::extract<memory_object &>(mo)().data());
+
+//     cl_event evt;
+//     PYOPENCL_RETRY_IF_MEM_ERROR(
+//       PYOPENCL_CALL_GUARDED(clEnqueueMigrateMemObjects, (
+//             cq.data(),
+//             mem_objects.size(), mem_objects.empty( ) ? NULL : &mem_objects.front(),
+//             flags,
+//             PYOPENCL_WAITLIST_ARGS, &evt
+//             ));
+//       );
+//     PYOPENCL_RETURN_NEW_EVENT(evt);
+//   }
+// #endif
+
+// #ifdef cl_ext_migrate_memobject
+//   inline
+//   event *enqueue_migrate_mem_object_ext(
+//       command_queue &cq,
+//       py::object py_mem_objects,
+//       cl_mem_migration_flags_ext flags,
+//       py::object py_wait_for)
+//   {
+//     PYOPENCL_PARSE_WAIT_FOR;
+
+// #if PYOPENCL_CL_VERSION >= 0x1020
+//     // {{{ get platform
+//     cl_device_id dev;
+//     PYOPENCL_CALL_GUARDED(clGetCommandQueueInfo, (cq.data(), CL_QUEUE_DEVICE,
+//           sizeof(dev), &dev, NULL));
+//     cl_platform_id plat;
+//     PYOPENCL_CALL_GUARDED(clGetDeviceInfo, (cq.data(), CL_DEVICE_PLATFORM,
+//           sizeof(plat), &plat, NULL));
+//     // }}}
+// #endif
+
+//     PYOPENCL_GET_EXT_FUN(plat,
+//         clEnqueueMigrateMemObjectEXT, enqueue_migrate_fn);
+
+//     std::vector<cl_mem> mem_objects;
+//     PYTHON_FOREACH(mo, py_mem_objects)
+//       mem_objects.push_back(py::extract<memory_object &>(mo)().data());
+
+//     cl_event evt;
+//     PYOPENCL_RETRY_IF_MEM_ERROR(
+//       PYOPENCL_CALL_GUARDED(enqueue_migrate_fn, (
+//             cq.data(),
+//             mem_objects.size(), mem_objects.empty( ) ? NULL : &mem_objects.front(),
+//             flags,
+//             PYOPENCL_WAITLIST_ARGS, &evt
+//             ));
+//       );
+//     PYOPENCL_RETURN_NEW_EVENT(evt);
+//   }
+// #endif
 
+// }}}
 
-  // {{{ image
+// {{{ image
 
-  class image : public memory_object
-  {
-    public:
-      PYOPENCL_DEF_GET_CLASS_T(IMAGE);
-      image(cl_mem mem, bool retain, void *hostbuf=0)
+class image : public memory_object {
+public:
+    PYOPENCL_DEF_GET_CLASS_T(IMAGE);
+    image(cl_mem mem, bool retain, void *hostbuf=0)
         : memory_object(mem, retain, hostbuf)
-      { }
-
-      generic_info get_image_info(cl_image_info param_name) const
-      {
+    {}
+    generic_info
+    get_image_info(cl_image_info param_name) const
+    {
         switch (param_name) {
         case CL_IMAGE_FORMAT:
             return pyopencl_get_int_info(cl_image_format, Image,
@@ -966,143 +982,77 @@ public:
 #endif
 
         default:
-            throw error("Image.get_image_info", CL_INVALID_VALUE);
+            throw clerror("Image.get_image_info", CL_INVALID_VALUE);
         }
-      }
-  };
+    }
+};
 static inline image*
 new_image(cl_mem mem, void *buff=0)
 {
     return pyopencl_convert_obj(image, clReleaseMemObject, mem, buff);
 }
 
-// {{{ image formats
-
-inline generic_info
-get_supported_image_formats(const context *ctx, cl_mem_flags flags,
-                            cl_mem_object_type image_type)
-{
-    cl_uint num_image_formats;
-    pyopencl_call_guarded(clGetSupportedImageFormats,
-                          ctx->data(), flags, image_type,
-                          0, NULL, &num_image_formats);
-
-    pyopencl_buf<cl_image_format> formats(num_image_formats);
-    pyopencl_call_guarded(clGetSupportedImageFormats,
-                          ctx->data(), flags, image_type,
-                          formats.len(), formats.get(), NULL);
-
-    return pyopencl_convert_array_info(cl_image_format, formats);
-}
-
-// }}}
-
 // {{{ image creation
 
-inline image*
-create_image_2d(const context *ctx, cl_mem_flags flags,
-                const cl_image_format *fmt, size_t width, size_t height,
-                size_t pitch, void *buffer, size_t size)
-{
-    auto mem = retry_mem_error<cl_mem>([&] {
-            return pyopencl_call_guarded(clCreateImage2D, ctx->data(), flags,
-                                         fmt, width, height, pitch, buffer);
-        });
-    return new_image(mem, flags & CL_MEM_USE_HOST_PTR ? buffer : NULL);
-}
-
-inline image*
-create_image_3d(const context *ctx, cl_mem_flags flags,
-                const cl_image_format *fmt, size_t width, size_t height,
-                size_t depth, size_t pitch_x, size_t pitch_y,
-                void *buffer, size_t size)
-{
-    auto mem = retry_mem_error<cl_mem>([&] {
-            return pyopencl_call_guarded(clCreateImage3D, ctx->data(), flags,
-                                         fmt, width, height, depth, pitch_x,
-                                         pitch_y, buffer);
-        });
-    return new_image(mem, flags & CL_MEM_USE_HOST_PTR ? buffer : NULL);
-}
-
-
-  // #if PYOPENCL_CL_VERSION >= 0x1020
-
-  //   inline
-  //   image *create_image_from_desc(
-  //       context const &ctx,
-  //       cl_mem_flags flags,
-  //       cl_image_format const &fmt,
-  //       cl_image_desc &desc,
-  //       py::object buffer)
-  //   {
-  //     if (buffer.ptr() != Py_None &&
-  //         !(flags & (CL_MEM_USE_HOST_PTR | CL_MEM_COPY_HOST_PTR)))
-  //       PyErr_Warn(PyExc_UserWarning, "'hostbuf' was passed, "
-  //           "but no memory flags to make use of it.");
-
-  //     void *buf = 0;
-  //     PYOPENCL_BUFFER_SIZE_T len;
-  //     py::object *retained_buf_obj = 0;
-
-  //     if (buffer.ptr() != Py_None)
-  //     {
-  //       if (flags & CL_MEM_USE_HOST_PTR)
-  //       {
-  //         if (PyObject_AsWriteBuffer(buffer.ptr(), &buf, &len))
-  //           throw py::error_already_set();
-  //       }
-  //       else
-  //       {
-  //         if (PyObject_AsReadBuffer(
-  //               buffer.ptr(), const_cast<const void **>(&buf), &len))
-  //           throw py::error_already_set();
-  //       }
-
-  //       if (flags & CL_MEM_USE_HOST_PTR)
-  //         retained_buf_obj = &buffer;
-  //     }
-
-  //     PYOPENCL_PRINT_CALL_TRACE("clCreateImage");
-  //     cl_int status_code;
-  //     cl_mem mem = clCreateImage(ctx.data(), flags, &fmt, &desc, buf, &status_code);
-  //     if (status_code != CL_SUCCESS)
-  //       throw pyopencl::error("clCreateImage", status_code);
-
-  //     try
-  //     {
-  //       return new image(mem, false, retained_buf_obj);
-  //     }
-  //     catch (...)
-  //     {
-  //       PYOPENCL_CALL_GUARDED(clReleaseMemObject, (mem));
-  //       throw;
-  //     }
-  //   }
+// #if PYOPENCL_CL_VERSION >= 0x1020
+
+//   inline
+//   image *create_image_from_desc(
+//       context const &ctx,
+//       cl_mem_flags flags,
+//       cl_image_format const &fmt,
+//       cl_image_desc &desc,
+//       py::object buffer)
+//   {
+//     if (buffer.ptr() != Py_None &&
+//         !(flags & (CL_MEM_USE_HOST_PTR | CL_MEM_COPY_HOST_PTR)))
+//       PyErr_Warn(PyExc_UserWarning, "'hostbuf' was passed, "
+//           "but no memory flags to make use of it.");
+
+//     void *buf = 0;
+//     PYOPENCL_BUFFER_SIZE_T len;
+//     py::object *retained_buf_obj = 0;
+
+//     if (buffer.ptr() != Py_None)
+//     {
+//       if (flags & CL_MEM_USE_HOST_PTR)
+//       {
+//         if (PyObject_AsWriteBuffer(buffer.ptr(), &buf, &len))
+//           throw py::error_already_set();
+//       }
+//       else
+//       {
+//         if (PyObject_AsReadBuffer(
+//               buffer.ptr(), const_cast<const void **>(&buf), &len))
+//           throw py::error_already_set();
+//       }
+
+//       if (flags & CL_MEM_USE_HOST_PTR)
+//         retained_buf_obj = &buffer;
+//     }
+
+//     PYOPENCL_PRINT_CALL_TRACE("clCreateImage");
+//     cl_int status_code;
+//     cl_mem mem = clCreateImage(ctx.data(), flags, &fmt, &desc, buf, &status_code);
+//     if (status_code != CL_SUCCESS)
+//       throw clerror("clCreateImage", status_code);
+
+//     try
+//     {
+//       return new image(mem, false, retained_buf_obj);
+//     }
+//     catch (...)
+//     {
+//       PYOPENCL_CALL_GUARDED(clReleaseMemObject, (mem));
+//       throw;
+//     }
+//   }
+
+// #endif
 
-  // #endif
-
-  // }}}
-
-  // {{{ image transfers
+// }}}
 
-inline event*
-enqueue_read_image(command_queue *cq, image *img, size_t *origin,
-                   size_t *region, void *buffer, size_t size, size_t row_pitch,
-                   size_t slice_pitch, const clobj_t *wait_for,
-                   uint32_t num_wait_for, bool is_blocking)
-{
-    auto _wait_for = buf_from_class<event>(wait_for, num_wait_for);
-    cl_event evt;
-    retry_mem_error<void>([&] {
-            pyopencl_call_guarded(clEnqueueReadImage, cq->data(), img->data(),
-                                  cast_bool(is_blocking), origin, region,
-                                  row_pitch, slice_pitch, buffer,
-                                  num_wait_for, _wait_for.get(), &evt);
-        });
-    return new_event(evt);
-    //PYOPENCL_RETURN_NEW_NANNY_EVENT(evt, buffer);
-}
+// {{{ image transfers
 
   //   inline
   //   event *enqueue_write_image(
@@ -1137,9 +1087,6 @@ enqueue_read_image(command_queue *cq, image *img, size_t *origin,
   //     PYOPENCL_RETURN_NEW_NANNY_EVENT(evt, buffer);
   //   }
 
-
-
-
   //   inline
   //   event *enqueue_copy_image(
   //       command_queue &cq,
@@ -1167,9 +1114,6 @@ enqueue_read_image(command_queue *cq, image *img, size_t *origin,
   //     PYOPENCL_RETURN_NEW_EVENT(evt);
   //   }
 
-
-
-
   //   inline
   //   event *enqueue_copy_image_to_buffer(
   //       command_queue &cq,
@@ -1263,25 +1207,21 @@ enqueue_read_image(command_queue *cq, image *img, size_t *origin,
 
 // }}}
 
-
-
-  // {{{ gl interop
-
+// {{{ gl interop
 
 #ifdef HAVE_GL
 
 #ifdef __APPLE__
-  inline
-  cl_context_properties get_apple_cgl_share_group()
-  {
+static inline cl_context_properties
+get_apple_cgl_share_group()
+{
     CGLContextObj kCGLContext = CGLGetCurrentContext();
     CGLShareGroupObj kCGLShareGroup = CGLGetShareGroup(kCGLContext);
 
-    return (cl_context_properties) kCGLShareGroup;
-  }
+    return (cl_context_properties)kCGLShareGroup;
+}
 #endif /* __APPLE__ */
 
-
 class gl_buffer : public memory_object {
 public:
     PYOPENCL_DEF_GET_CLASS_T(GL_BUFFER);
@@ -1295,29 +1235,29 @@ public:
     PYOPENCL_DEF_GET_CLASS_T(GL_RENDERBUFFER);
     gl_renderbuffer(cl_mem mem, bool retain, void *hostbuf=0)
         : memory_object(mem, retain, hostbuf)
-    { }
+    {}
 };
 
 class gl_texture : public image {
   public:
     gl_texture(cl_mem mem, bool retain, void *hostbuf=0)
       : image(mem, retain, hostbuf)
-    { }
-
-    generic_info get_gl_texture_info(cl_gl_texture_info param_name)
+    {}
+    generic_info
+    get_gl_texture_info(cl_gl_texture_info param_name)
     {
-      switch (param_name) {
-      case CL_GL_TEXTURE_TARGET:
-          return pyopencl_get_int_info(GLenum, GLTexture, data(), param_name);
-      case CL_GL_MIPMAP_LEVEL:
-          return pyopencl_get_int_info(GLint, GLTexture, data(), param_name);
-      default:
-          throw error("MemoryObject.get_gl_texture_info", CL_INVALID_VALUE);
-      }
+        switch (param_name) {
+        case CL_GL_TEXTURE_TARGET:
+            return pyopencl_get_int_info(GLenum, GLTexture, data(), param_name);
+        case CL_GL_MIPMAP_LEVEL:
+            return pyopencl_get_int_info(GLint, GLTexture, data(), param_name);
+        default:
+            throw clerror("MemoryObject.get_gl_texture_info", CL_INVALID_VALUE);
+        }
     }
-  };
+};
 
-inline gl_texture*
+static gl_texture*
 create_from_gl_texture(context &ctx, cl_mem_flags flags, GLenum texture_target,
                        GLint miplevel, GLuint texture, unsigned dims)
 {
@@ -1332,7 +1272,7 @@ create_from_gl_texture(context &ctx, cl_mem_flags flags, GLenum texture_target,
                                            miplevel, texture);
         return pyopencl_convert_obj(gl_texture, clReleaseMemObject, mem);
     } else {
-        throw pyopencl::error("Image", CL_INVALID_VALUE, "invalid dimension");
+        throw clerror("Image", CL_INVALID_VALUE, "invalid dimension");
     }
 }
 
@@ -1506,7 +1446,7 @@ public:
     //           throw py::error_already_set();
 
     //         if (stride != 1)
-    //           throw pyopencl::error("Buffer.__getitem__", CL_INVALID_VALUE,
+    //           throw clerror("Buffer.__getitem__", CL_INVALID_VALUE,
     //               "Buffer slice must have stride 1");
 
     //         cl_mem_flags my_flags;
@@ -1523,27 +1463,10 @@ new_buffer(cl_mem mem, void *buff)
     return pyopencl_convert_obj(buffer, clReleaseMemObject, mem, buff);
 }
 
-// {{{ buffer creation
-
-inline buffer*
-create_buffer(context *ctx, cl_mem_flags flags, size_t size, void *py_hostbuf)
-{
-    void *retained_buf_obj = 0;
-    if (py_hostbuf != NULL && flags & CL_MEM_USE_HOST_PTR) {
-        retained_buf_obj = py_hostbuf;
-    }
-    auto mem = retry_mem_error<cl_mem>([&] {
-            return pyopencl_call_guarded(clCreateBuffer, ctx->data(),
-                                         flags, size, py_hostbuf);
-        });
-    return new_buffer(mem, retained_buf_obj);
-}
-
-// }}}
 // }}}
 
-
 // {{{ sampler
+
 class sampler : public clobj<cl_sampler> {
 public:
     PYOPENCL_DEF_GET_CLASS_T(SAMPLER);
@@ -1584,7 +1507,7 @@ public:
                                          data(), param_name);
 
         default:
-            throw error("Sampler.get_info", CL_INVALID_VALUE);
+            throw clerror("Sampler.get_info", CL_INVALID_VALUE);
         }
     }
 };
@@ -1674,7 +1597,7 @@ public:
             return pyopencl_get_str_info(Program, data(), param_name);
 #endif
         default:
-            throw error("Program.get_info", CL_INVALID_VALUE);
+            throw clerror("Program.get_info", CL_INVALID_VALUE);
         }
     }
     generic_info
@@ -1694,7 +1617,7 @@ public:
                                          data(), dev->data(), param_name);
 #endif
         default:
-            throw error("Program.get_build_info", CL_INVALID_VALUE);
+            throw clerror("Program.get_build_info", CL_INVALID_VALUE);
         }
     }
     void
@@ -1749,32 +1672,6 @@ new_program(cl_program prog, program_kind_type progkind=KND_UNKNOWN)
     return pyopencl_convert_obj(program, clReleaseProgram, prog, progkind);
 }
 
-inline program*
-create_program_with_source(context *ctx, const char *string)
-{
-    size_t length = strlen(string);
-    cl_program result = pyopencl_call_guarded(clCreateProgramWithSource,
-                                              ctx->data(), 1, &string, &length);
-    return new_program(result, KND_SOURCE);
-}
-
-
-inline program*
-create_program_with_binary(context *ctx, cl_uint num_devices,
-                           const clobj_t *ptr_devices, cl_uint num_binaries,
-                           char **binaries, size_t *binary_sizes)
-{
-    auto devices = buf_from_class<device>(ptr_devices, num_devices);
-    pyopencl_buf<cl_int> binary_statuses(num_devices);
-    cl_program result = pyopencl_call_guarded(
-        clCreateProgramWithBinary, ctx->data(), num_devices, devices.get(),
-        binary_sizes, reinterpret_cast<const unsigned char**>(
-            const_cast<const char**>(binaries)), binary_statuses.get());
-    // for (cl_uint i = 0; i < num_devices; ++i)
-    //   std::cout << i << ":" << binary_statuses[i] << std::endl;
-    return new_program(result, KND_BINARY);
-}
-
 // }}}
 
 // {{{ kernel
@@ -1844,7 +1741,7 @@ public:
             return pyopencl_get_str_info(Kernel, data(), param_name);
 #endif
         default:
-            throw error("Kernel.get_info", CL_INVALID_VALUE);
+            throw clerror("Kernel.get_info", CL_INVALID_VALUE);
         }
     }
     generic_info
@@ -1868,7 +1765,7 @@ public:
             return pyopencl_get_int_info(cl_ulong, KernelWorkGroup,
                                          data(), dev->data(), param_name);
         default:
-            throw error("Kernel.get_work_group_info", CL_INVALID_VALUE);
+            throw clerror("Kernel.get_work_group_info", CL_INVALID_VALUE);
         }
     }
 
@@ -1904,188 +1801,86 @@ public:
 
 // }}}
 
-
-// {{{ buffer transfers
-
-inline event*
-enqueue_read_buffer(command_queue *cq, memory_object_holder *mem,
-                    void *buffer, size_t size, size_t device_offset,
-                    const clobj_t *wait_for, uint32_t num_wait_for,
-                    bool is_blocking)
-{
-    auto _wait_for = buf_from_class<event>(wait_for, num_wait_for);
-    cl_event evt;
-    retry_mem_error<void>([&] {
-            pyopencl_call_guarded(clEnqueueReadBuffer, cq->data(), mem->data(),
-                                  cast_bool(is_blocking), device_offset, size,
-                                  buffer, num_wait_for, _wait_for.get(), &evt);
-        });
-    return new_event(evt);
 }
 
-inline event*
-enqueue_copy_buffer(command_queue *cq, memory_object_holder *src,
-                    memory_object_holder *dst, ptrdiff_t byte_count,
-                    size_t src_offset, size_t dst_offset,
-                    const clobj_t *wait_for, uint32_t num_wait_for)
-{
-    if (byte_count < 0) {
-        size_t byte_count_src = 0;
-        size_t byte_count_dst = 0;
-        pyopencl_call_guarded(clGetMemObjectInfo, src->data(), CL_MEM_SIZE,
-                              sizeof(byte_count), &byte_count_src, NULL);
-        pyopencl_call_guarded(clGetMemObjectInfo, src->data(), CL_MEM_SIZE,
-                              sizeof(byte_count), &byte_count_dst, NULL);
-        byte_count = std::min(byte_count_src, byte_count_dst);
-    }
-    auto _wait_for = buf_from_class<event>(wait_for, num_wait_for);
-    cl_event evt;
-    retry_mem_error<void>([&] {
-            pyopencl_call_guarded(clEnqueueCopyBuffer, cq->data(), src->data(),
-                                  dst->data(), src_offset, dst_offset,
-                                  byte_count, num_wait_for,
-                                  _wait_for.get(), &evt);
-        });
-    return new_event(evt);
-}
 
-inline event*
-enqueue_write_buffer(command_queue *cq, memory_object_holder *mem,
-                     const void *buffer, size_t size, size_t device_offset,
-                     const clobj_t *wait_for, uint32_t num_wait_for,
-                     bool is_blocking)
-{
-    auto _wait_for = buf_from_class<event>(wait_for, num_wait_for);
-    cl_event evt;
-    retry_mem_error<void>([&] {
-            pyopencl_call_guarded(clEnqueueWriteBuffer, cq->data(), mem->data(),
-                                  cast_bool(is_blocking), device_offset,
-                                  size, buffer, num_wait_for,
-                                  _wait_for.get(), &evt);
-        });
-    return new_event(evt);
-    //PYOPENCL_RETURN_NEW_NANNY_EVENT(evt, buffer);
-}
-
-// }}}
-
-inline event*
-enqueue_nd_range_kernel(command_queue *cq, kernel *knl, cl_uint work_dim,
-                        const size_t *global_work_offset,
-                        const size_t *global_work_size,
-                        const size_t *local_work_size,
-                        const clobj_t *wait_for, uint32_t num_wait_for)
-{
-    auto _wait_for = buf_from_class<event>(wait_for, num_wait_for);
-    cl_event evt;
-    retry_mem_error<void>([&] {
-            pyopencl_call_guarded(clEnqueueNDRangeKernel, cq->data(),
-                                  knl->data(), work_dim, global_work_offset,
-                                  global_work_size, local_work_size,
-                                  num_wait_for, _wait_for.get(), &evt);
-        });
-    return new_event(evt);
-}
+// {{{ c wrapper
 
-#if PYOPENCL_CL_VERSION >= 0x1020
-inline event*
-enqueue_marker_with_wait_list(command_queue *cq, const clobj_t *wait_for,
-                              uint32_t num_wait_for)
-{
-    auto _wait_for = buf_from_class<event>(wait_for, num_wait_for);
-    cl_event evt;
-    pyopencl_call_guarded(clEnqueueMarkerWithWaitList, cq->data(),
-                          num_wait_for, _wait_for.get(), &evt);
-    return new_event(evt);
-}
+// Import all the names in pyopencl namespace for c wrappers.
+using namespace pyopencl;
 
-inline event*
-enqueue_barrier_with_wait_list(command_queue *cq, const clobj_t *wait_for,
-                               uint32_t num_wait_for)
+// Generic functions
+int
+get_cl_version()
 {
-    auto _wait_for = buf_from_class<event>(wait_for, num_wait_for);
-    cl_event evt;
-    pyopencl_call_guarded(clEnqueueBarrierWithWaitList, cq->data(),
-                          num_wait_for, _wait_for.get(), &evt);
-    return new_event(evt);
+    return PYOPENCL_CL_VERSION;
 }
-#endif
 
-inline event*
-enqueue_marker(command_queue *cq)
+void
+free_pointer(void *p)
 {
-    cl_event evt;
-    pyopencl_call_guarded(clEnqueueMarker, cq->data(), &evt);
-    return new_event(evt);
+    free(p);
 }
 
-inline void
-enqueue_barrier(command_queue *cq)
+void
+free_pointer_array(void **p, uint32_t size)
 {
-    pyopencl_call_guarded(clEnqueueBarrier, cq->data());
-}
+    for (uint32_t i = 0;i < size;i++) {
+        free(p[i]);
+    }
 }
 
-
-// {{{ c wrapper
-
-void pyopencl_free_pointer(void *p)
+void
+set_gc(int (*func)())
 {
-  free(p);
+    python_gc = func ? func : dummy_python_gc;
 }
 
-void pyopencl_free_pointer_array(void **p, uint32_t size)
+int have_gl()
 {
-    for (uint32_t i = 0;i < size;i++) {
-        pyopencl_free_pointer(p[i]);
-    }
+#ifdef HAVE_GL
+    return 1;
+#else
+    return 0;
+#endif
 }
 
-void
-pyopencl_set_gc(int (*func)())
-{
-    if (!func)
-        func = pyopencl::dummy_python_gc;
-    pyopencl::python_gc = func;
-}
 
-::error*
-get_platforms(clobj_t **ptr_platforms, uint32_t *num_platforms)
+// Platform
+error*
+get_platforms(clobj_t **_platforms, uint32_t *num_platforms)
 {
-    return pyopencl::c_handle_error([&] {
+    return c_handle_error([&] {
             *num_platforms = 0;
             pyopencl_call_guarded(clGetPlatformIDs, 0, NULL, num_platforms);
             pyopencl_buf<cl_platform_id> platforms(*num_platforms);
             pyopencl_call_guarded(clGetPlatformIDs, *num_platforms,
                                   platforms.get(), num_platforms);
-            *ptr_platforms =
-                pyopencl::buf_to_base<pyopencl::platform>(platforms).release();
+            *_platforms = buf_to_base<platform>(platforms).release();
         });
 }
 
-
-::error*
-platform__get_devices(clobj_t platform, clobj_t **ptr_devices,
+error*
+platform__get_devices(clobj_t _plat, clobj_t **_devices,
                       uint32_t *num_devices, cl_device_type devtype)
 {
-    return pyopencl::c_handle_error([&] {
-            auto devices = static_cast<pyopencl::platform*>(platform)
-                ->get_devices(devtype);
+    auto plat = static_cast<platform*>(_plat);
+    return c_handle_error([&] {
+            auto devices = plat->get_devices(devtype);
             *num_devices = devices.len();
-            *ptr_devices =
-                pyopencl::buf_to_base<pyopencl::device>(devices).release();
+            *_devices = buf_to_base<device>(devices).release();
         });
 }
 
 
-::error*
-_create_context(clobj_t *ptr_ctx, const cl_context_properties *properties,
-                cl_uint num_devices, const clobj_t *ptr_devices)
+// Context
+error*
+create_context(clobj_t *_ctx, const cl_context_properties *properties,
+               cl_uint num_devices, const clobj_t *_devices)
 {
-    return pyopencl::c_handle_error([&] {
-            auto devices = pyopencl::buf_from_class<pyopencl::device>(
-                ptr_devices, num_devices);
-            *ptr_ctx = new pyopencl::context(
+    return c_handle_error([&] {
+            auto devices = buf_from_class<device>(_devices, num_devices);
+            *_ctx = new context(
                 pyopencl_call_guarded(
                     clCreateContext,
                     const_cast<cl_context_properties*>(properties),
@@ -2093,475 +1888,530 @@ _create_context(clobj_t *ptr_ctx, const cl_context_properties *properties,
         });
 }
 
-
-::error*
-_create_command_queue(clobj_t *queue, clobj_t context,
-                      clobj_t device, cl_command_queue_properties properties)
+error*
+context__get_supported_image_formats(clobj_t _ctx, cl_mem_flags flags,
+                                     cl_mem_object_type image_type,
+                                     generic_info *out)
 {
-    auto ctx = static_cast<pyopencl::context*>(context);
-    auto dev = static_cast<pyopencl::device*>(device);
-    return pyopencl::c_handle_error([&] {
-            *queue = new pyopencl::command_queue(ctx, dev, properties);
+    auto ctx = static_cast<context*>(_ctx);
+    return c_handle_error([&] {
+            *out = ctx->get_supported_image_formats(flags, image_type);
         });
 }
 
 
-::error*
-_create_buffer(clobj_t *buffer, clobj_t context, cl_mem_flags flags,
-               size_t size, void *hostbuf)
+// Command Queue
+error*
+create_command_queue(clobj_t *queue, clobj_t _ctx,
+                     clobj_t _dev, cl_command_queue_properties properties)
 {
-    auto ctx = static_cast<pyopencl::context*>(context);
-    return pyopencl::c_handle_error([&] {
-            *buffer = create_buffer(ctx, flags, size, hostbuf);
+    auto ctx = static_cast<context*>(_ctx);
+    auto dev = static_cast<device*>(_dev);
+    return c_handle_error([&] {
+            *queue = new command_queue(ctx, dev, properties);
         });
 }
 
-// {{{ program
-
-::error*
-_create_program_with_source(clobj_t *program, clobj_t context, const char *src)
+error*
+command_queue__finish(clobj_t queue)
 {
-    auto ctx = static_cast<pyopencl::context*>(context);
-    return pyopencl::c_handle_error([&] {
-            *program = create_program_with_source(ctx, src);
+    return c_handle_error([&] {
+            static_cast<command_queue*>(queue)->finish();
         });
 }
 
-::error*
-_create_program_with_binary(
-    clobj_t *program, clobj_t context, cl_uint num_devices,
-    const  clobj_t *devices, cl_uint num_binaries, char **binaries,
-    size_t *binary_sizes)
+error*
+command_queue__flush(clobj_t queue)
 {
-    auto ctx = static_cast<pyopencl::context*>(context);
-    return pyopencl::c_handle_error([&] {
-            *program = create_program_with_binary(
-                ctx, num_devices, devices,
-                num_binaries, binaries, binary_sizes);
+    return c_handle_error([&] {
+            static_cast<command_queue*>(queue)->flush();
         });
 }
 
-::error*
-program__build(clobj_t program, const char *options,
-               cl_uint num_devices, const clobj_t *devices)
-{
-    return pyopencl::c_handle_error([&] {
-            static_cast<pyopencl::program*>(program)->build(
-                options, num_devices, devices);
+
+// Buffer
+error*
+create_buffer(clobj_t *buffer, clobj_t _ctx, cl_mem_flags flags,
+              size_t size, void *hostbuf)
+{
+    auto ctx = static_cast<context*>(_ctx);
+    return c_handle_error([&] {
+            auto mem = retry_mem_error<cl_mem>([&] {
+                    return pyopencl_call_guarded(clCreateBuffer, ctx->data(),
+                                                 flags, size, hostbuf);
+                });
+            *buffer = new_buffer(mem, (flags & CL_MEM_USE_HOST_PTR ?
+                                       hostbuf : NULL));
         });
 }
 
-::error*
-program__kind(clobj_t program, int *kind)
+
+// Memory Object
+error*
+memory_object__release(clobj_t obj)
 {
-    return pyopencl::c_handle_error([&] {
-            *kind = static_cast<pyopencl::program*>(program)->kind();
+    return c_handle_error([&] {
+            static_cast<memory_object*>(obj)->release();
         });
 }
 
-::error*
-program__get_build_info(clobj_t program, clobj_t device,
-                        cl_program_build_info param, generic_info *out)
-{
-    return pyopencl::c_handle_error([&] {
-            *out = static_cast<pyopencl::program*>(program)
-                ->get_build_info(
-                    static_cast<pyopencl::device*>(device), param);
+// Program
+error*
+create_program_with_source(clobj_t *prog, clobj_t _ctx, const char *src)
+{
+    auto ctx = static_cast<context*>(_ctx);
+    return c_handle_error([&] {
+            size_t length = strlen(src);
+            cl_program result = pyopencl_call_guarded(
+                clCreateProgramWithSource, ctx->data(), 1, &src, &length);
+            *prog = new_program(result, KND_SOURCE);
         });
 }
 
-// }}}
-
-::error*
-_create_sampler(clobj_t *sampler, clobj_t context, int normalized_coordinates,
-                cl_addressing_mode am, cl_filter_mode fm)
+error*
+create_program_with_binary(clobj_t *prog, clobj_t _ctx,
+                           cl_uint num_devices, const clobj_t *devices,
+                           char **binaries, size_t *binary_sizes)
 {
-    return pyopencl::c_handle_error([&] {
-            *sampler = new pyopencl::sampler(
-                static_cast<pyopencl::context*>(context),
-                (bool)normalized_coordinates, am, fm);
+    auto ctx = static_cast<context*>(_ctx);
+    auto devs = buf_from_class<device>(devices, num_devices);
+    pyopencl_buf<cl_int> binary_statuses(num_devices);
+    return c_handle_error([&] {
+            cl_program result = pyopencl_call_guarded(
+                clCreateProgramWithBinary, ctx->data(), num_devices, devs.get(),
+                binary_sizes, reinterpret_cast<const unsigned char**>(
+                    const_cast<const char**>(binaries)), binary_statuses.get());
+            // for (cl_uint i = 0; i < num_devices; ++i)
+            //   std::cout << i << ":" << binary_statuses[i] << std::endl;
+            *prog = new_program(result, KND_BINARY);
         });
 }
 
-// {{{ event
+error*
+program__build(clobj_t _prog, const char *options,
+               cl_uint num_devices, const clobj_t *devices)
+{
+    auto prog = static_cast<program*>(_prog);
+    return c_handle_error([&] {
+            prog->build(options, num_devices, devices);
+        });
+}
 
-::error*
-event__get_profiling_info(clobj_t event, cl_profiling_info param,
-                          generic_info *out)
+error*
+program__kind(clobj_t prog, int *kind)
 {
-    return pyopencl::c_handle_error([&] {
-            *out = static_cast<pyopencl::event*>(event)
-                ->get_profiling_info(param);
+    return c_handle_error([&] {
+            *kind = static_cast<program*>(prog)->kind();
         });
 }
 
-::error*
-event__wait(clobj_t event)
+error*
+program__get_build_info(clobj_t _prog, clobj_t _dev,
+                        cl_program_build_info param, generic_info *out)
 {
-    return pyopencl::c_handle_error([&] {
-            static_cast<pyopencl::event*>(event)->wait();
+    auto prog = static_cast<program*>(_prog);
+    auto dev = static_cast<device*>(_dev);
+    return c_handle_error([&] {
+            *out = prog->get_build_info(dev, param);
         });
 }
 
-// }}}
 
+// Sampler
+error*
+create_sampler(clobj_t *samp, clobj_t _ctx, int norm_coords,
+               cl_addressing_mode am, cl_filter_mode fm)
+{
+    auto ctx = static_cast<context*>(_ctx);
+    return c_handle_error([&] {
+            *samp = new sampler(ctx, (bool)norm_coords, am, fm);
+        });
+}
 
-// {{{ kernel
 
-::error*
-_create_kernel(clobj_t *kernel, clobj_t program, const char *name)
+// Kernel
+error*
+create_kernel(clobj_t *knl, clobj_t _prog, const char *name)
 {
-    auto prg = static_cast<pyopencl::program*>(program);
-    return pyopencl::c_handle_error([&] {
-            *kernel = new pyopencl::kernel(prg, name);
+    auto prog = static_cast<program*>(_prog);
+    return c_handle_error([&] {
+            *knl = new kernel(prog, name);
         });
 }
 
-::error*
-kernel__set_arg_null(clobj_t kernel, cl_uint arg_index)
+error*
+kernel__set_arg_null(clobj_t knl, cl_uint arg_index)
 {
-    return pyopencl::c_handle_error([&] {
-            static_cast<pyopencl::kernel*>(kernel)->set_arg_null(arg_index);
+    return c_handle_error([&] {
+            static_cast<kernel*>(knl)->set_arg_null(arg_index);
         });
 }
 
-::error*
-kernel__set_arg_mem(clobj_t kernel, cl_uint arg_index, clobj_t _mem)
+error*
+kernel__set_arg_mem(clobj_t _knl, cl_uint arg_index, clobj_t _mem)
 {
-    auto mem = static_cast<pyopencl::memory_object_holder*>(_mem);
-    return pyopencl::c_handle_error([&] {
-            static_cast<pyopencl::kernel*>(kernel)
-                ->set_arg_mem(arg_index, mem);
+    auto knl = static_cast<kernel*>(_knl);
+    auto mem = static_cast<memory_object_holder*>(_mem);
+    return c_handle_error([&] {
+            knl->set_arg_mem(arg_index, mem);
         });
 }
 
-::error*
-kernel__set_arg_sampler(clobj_t kernel, cl_uint arg_index, clobj_t sampler)
+error*
+kernel__set_arg_sampler(clobj_t _knl, cl_uint arg_index, clobj_t _samp)
 {
-    return pyopencl::c_handle_error([&] {
-            static_cast<pyopencl::kernel*>(kernel)
-                ->set_arg_sampler(arg_index,
-                                  static_cast<pyopencl::sampler*>(sampler));
+    auto knl = static_cast<kernel*>(_knl);
+    auto samp = static_cast<sampler*>(_samp);
+    return c_handle_error([&] {
+            knl->set_arg_sampler(arg_index, samp);
         });
 }
 
-::error*
-kernel__set_arg_buf(clobj_t kernel, cl_uint arg_index,
+error*
+kernel__set_arg_buf(clobj_t _knl, cl_uint arg_index,
                     const void *buffer, size_t size)
 {
-    return pyopencl::c_handle_error([&] {
-            static_cast<pyopencl::kernel*>(kernel)
-                ->set_arg_buf(arg_index, buffer, size);
+    auto knl = static_cast<kernel*>(_knl);
+    return c_handle_error([&] {
+            knl->set_arg_buf(arg_index, buffer, size);
         });
 }
 
-
-::error*
-kernel__get_work_group_info(clobj_t kernel, cl_kernel_work_group_info param,
-                            clobj_t device, generic_info *out)
+error*
+kernel__get_work_group_info(clobj_t _knl, cl_kernel_work_group_info param,
+                            clobj_t _dev, generic_info *out)
 {
-    return pyopencl::c_handle_error([&] {
-            *out = static_cast<pyopencl::kernel*>(kernel)
-                ->get_work_group_info(param, static_cast<pyopencl::device*>(
-                                          device));
+    auto knl = static_cast<kernel*>(_knl);
+    auto dev = static_cast<device*>(_dev);
+    return c_handle_error([&] {
+            *out = knl->get_work_group_info(param, dev);
         });
 }
 
-// }}}
-
 
-// {{{ image
+// Image
+error*
+create_image_2d(clobj_t *img, clobj_t _ctx, cl_mem_flags flags,
+                cl_image_format *fmt, size_t width, size_t height,
+                size_t pitch, void *buffer)
+{
+    auto ctx = static_cast<context*>(_ctx);
+    return c_handle_error([&] {
+            auto mem = retry_mem_error<cl_mem>([&] {
+                    return pyopencl_call_guarded(
+                        clCreateImage2D, ctx->data(), flags,
+                        fmt, width, height, pitch, buffer);
+                });
+            *img = new_image(mem, (flags & CL_MEM_USE_HOST_PTR ?
+                                   buffer : NULL));
+        });
+}
 
-::error*
-_get_supported_image_formats(clobj_t context, cl_mem_flags flags,
-                             cl_mem_object_type image_type, generic_info *out)
-{
-    return pyopencl::c_handle_error([&] {
-            *out = get_supported_image_formats(
-                static_cast<pyopencl::context*>(context), flags, image_type);
+error*
+create_image_3d(clobj_t *img, clobj_t _ctx, cl_mem_flags flags,
+                cl_image_format *fmt, size_t width, size_t height,
+                size_t depth, size_t pitch_x, size_t pitch_y, void *buffer)
+{
+    auto ctx = static_cast<context*>(_ctx);
+    return c_handle_error([&] {
+            auto mem = retry_mem_error<cl_mem>([&] {
+                    return pyopencl_call_guarded(
+                        clCreateImage3D, ctx->data(), flags, fmt, width,
+                        height, depth, pitch_x, pitch_y, buffer);
+                });
+            *img = new_image(mem, (flags & CL_MEM_USE_HOST_PTR ?
+                                   buffer : NULL));
         });
 }
 
-::error*
-_create_image_2d(clobj_t *image, clobj_t context, cl_mem_flags flags,
-                 cl_image_format *fmt, size_t width, size_t height,
-                 size_t pitch, void *buffer, size_t size)
+error*
+image__get_image_info(clobj_t img, cl_image_info param, generic_info *out)
 {
-    return pyopencl::c_handle_error([&] {
-            *image = create_image_2d(
-                static_cast<pyopencl::context*>(context), flags, fmt,
-                width, height, pitch, buffer, size);
+    return c_handle_error([&] {
+            *out = static_cast<image*>(img)->get_image_info(param);
         });
 }
 
-::error*
-_create_image_3d(clobj_t *image, clobj_t context, cl_mem_flags flags,
-                 cl_image_format *fmt, size_t width, size_t height,
-                 size_t depth, size_t pitch_x, size_t pitch_y,
-                 void *buffer, size_t size)
+
+// Event
+error*
+event__get_profiling_info(clobj_t _evt, cl_profiling_info param,
+                          generic_info *out)
 {
-    return pyopencl::c_handle_error([&] {
-            *image = create_image_3d(
-                static_cast<pyopencl::context*>(context), flags, fmt,
-                width, height, depth, pitch_x, pitch_y, buffer, size);
+    auto evt = static_cast<event*>(_evt);
+    return c_handle_error([&] {
+            *out = evt->get_profiling_info(param);
         });
 }
 
-::error*
-image__get_image_info(clobj_t image, cl_image_info param, generic_info *out)
+error*
+event__wait(clobj_t evt)
 {
-    return pyopencl::c_handle_error([&] {
-            *out = static_cast<pyopencl::image*>(image)->get_image_info(param);
+    return c_handle_error([&] {
+            static_cast<event*>(evt)->wait();
         });
 }
 
-// }}}
 
-::error*
-_enqueue_nd_range_kernel(clobj_t *event, clobj_t queue, clobj_t kernel,
-                         cl_uint work_dim, const size_t *global_work_offset,
-                         const size_t *global_work_size,
-                         const size_t *local_work_size,
-                         const clobj_t *wait_for, uint32_t num_wait_for)
-{
-    return pyopencl::c_handle_error([&] {
-            *event = enqueue_nd_range_kernel(
-                static_cast<pyopencl::command_queue*>(queue),
-                static_cast<pyopencl::kernel*>(kernel),
-                work_dim, global_work_offset,
-                global_work_size, local_work_size,
-                wait_for, num_wait_for);
+// enqueue_*
+error*
+enqueue_nd_range_kernel(clobj_t *_evt, clobj_t _queue, clobj_t _knl,
+                        cl_uint work_dim, const size_t *global_work_offset,
+                        const size_t *global_work_size,
+                        const size_t *local_work_size,
+                        const clobj_t *_wait_for, uint32_t num_wait_for)
+{
+    auto queue = static_cast<command_queue*>(_queue);
+    auto knl = static_cast<kernel*>(_knl);
+    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(
+                        clEnqueueNDRangeKernel, queue->data(), knl->data(),
+                        work_dim, global_work_offset, global_work_size,
+                        local_work_size, num_wait_for, wait_for.get(), &evt);
+                });
+            *_evt = new_event(evt);
         });
 }
 
 #if PYOPENCL_CL_VERSION >= 0x1020
-::error*
-_enqueue_marker_with_wait_list(clobj_t *event, clobj_t queue,
-                               const clobj_t *wait_for, uint32_t num_wait_for)
-{
-    return pyopencl::c_handle_error([&] {
-            *event = enqueue_marker_with_wait_list(
-                static_cast<pyopencl::command_queue*>(queue),
-                wait_for, num_wait_for);
+error*
+enqueue_marker_with_wait_list(clobj_t *_evt, clobj_t _queue,
+                              const clobj_t *_wait_for, uint32_t num_wait_for)
+{
+    auto queue = static_cast<command_queue*>(_queue);
+    auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
+    return c_handle_error([&] {
+            cl_event evt;
+            pyopencl_call_guarded(clEnqueueMarkerWithWaitList, queue->data(),
+                                  num_wait_for, wait_for.get(), &evt);
+            *_evt = new_event(evt);
         });
 }
 
-::error*
-_enqueue_barrier_with_wait_list(clobj_t *event, clobj_t queue,
-                                const clobj_t *wait_for, uint32_t num_wait_for)
-{
-    return pyopencl::c_handle_error([&] {
-            *event = enqueue_barrier_with_wait_list(
-                static_cast<pyopencl::command_queue*>(queue),
-                wait_for, num_wait_for);
+error*
+enqueue_barrier_with_wait_list(clobj_t *_evt, clobj_t _queue,
+                               const clobj_t *_wait_for, uint32_t num_wait_for)
+{
+    auto queue = static_cast<command_queue*>(_queue);
+    auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
+    return c_handle_error([&] {
+            cl_event evt;
+            pyopencl_call_guarded(clEnqueueBarrierWithWaitList, queue->data(),
+                                  num_wait_for, wait_for.get(), &evt);
+            *_evt = new_event(evt);
         });
 }
 #endif
 
-::error*
-_enqueue_marker(clobj_t *event, clobj_t queue)
+error*
+enqueue_marker(clobj_t *_evt, clobj_t _queue)
 {
-    return pyopencl::c_handle_error([&] {
-            *event = enqueue_marker(
-                static_cast<pyopencl::command_queue*>(queue));
+    auto queue = static_cast<command_queue*>(_queue);
+    return c_handle_error([&] {
+            cl_event evt;
+            pyopencl_call_guarded(clEnqueueMarker, queue->data(), &evt);
+            *_evt = new_event(evt);
         });
 }
 
-::error*
-_enqueue_barrier(clobj_t queue)
+error*
+enqueue_barrier(clobj_t _queue)
 {
-    return pyopencl::c_handle_error([&] {
-            enqueue_barrier(static_cast<pyopencl::command_queue*>(queue));
+    auto queue = static_cast<command_queue*>(_queue);
+    return c_handle_error([&] {
+            pyopencl_call_guarded(clEnqueueBarrier, queue->data());
         });
 }
 
 // {{{ transfer enqueues
 
-::error*
-_enqueue_read_buffer(clobj_t *event, clobj_t queue, clobj_t mem,
-                     void *buffer, size_t size, size_t device_offset,
-                     const clobj_t *wait_for, uint32_t num_wait_for,
-                     int is_blocking)
+error*
+enqueue_read_buffer(clobj_t *_evt, clobj_t _queue, clobj_t _mem,
+                    void *buffer, size_t size, size_t device_offset,
+                    const clobj_t *_wait_for, uint32_t num_wait_for,
+                    int is_blocking)
 {
-    return pyopencl::c_handle_error([&] {
-            *event = enqueue_read_buffer(
-                static_cast<pyopencl::command_queue*>(queue),
-                static_cast<pyopencl::memory_object_holder*>(mem),
-                buffer, size, device_offset, wait_for,
-                num_wait_for, (bool)is_blocking);
+    auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
+    auto queue = static_cast<command_queue*>(_queue);
+    auto mem = static_cast<memory_object_holder*>(_mem);
+    return c_handle_error([&] {
+            cl_event evt;
+            retry_mem_error<void>([&] {
+                    pyopencl_call_guarded(
+                        clEnqueueReadBuffer, queue->data(), mem->data(),
+                        cast_bool(is_blocking), device_offset, size,
+                        buffer, num_wait_for, wait_for.get(), &evt);
+                });
+            *_evt = new_event(evt);
         });
 }
 
-::error*
-_enqueue_write_buffer(clobj_t *event, clobj_t queue, clobj_t mem,
-                      const void *buffer, size_t size, size_t device_offset,
-                      const clobj_t *wait_for, uint32_t num_wait_for,
-                      int is_blocking)
+error*
+enqueue_write_buffer(clobj_t *_evt, clobj_t _queue, clobj_t _mem,
+                     const void *buffer, size_t size, size_t device_offset,
+                     const clobj_t *_wait_for, uint32_t num_wait_for,
+                     int is_blocking)
 {
-    return pyopencl::c_handle_error([&] {
-            *event = enqueue_write_buffer(
-                static_cast<pyopencl::command_queue*>(queue),
-                static_cast<pyopencl::memory_object_holder*>(mem),
-                buffer, size, device_offset, wait_for,
-                num_wait_for, (bool)is_blocking);
+    auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
+    auto queue = static_cast<command_queue*>(_queue);
+    auto mem = static_cast<memory_object_holder*>(_mem);
+    return c_handle_error([&] {
+            cl_event evt;
+            retry_mem_error<void>([&] {
+                    pyopencl_call_guarded(
+                        clEnqueueWriteBuffer, queue->data(), mem->data(),
+                        cast_bool(is_blocking), device_offset,
+                        size, buffer, num_wait_for, wait_for.get(), &evt);
+                });
+            *_evt = new_event(evt);
+            // PYOPENCL_RETURN_NEW_NANNY_EVENT(evt, buffer);
         });
 }
 
-
-::error*
-_enqueue_copy_buffer(clobj_t *event, clobj_t queue, clobj_t src, clobj_t dst,
-                     ptrdiff_t byte_count, size_t src_offset, size_t dst_offset,
-                     const clobj_t *wait_for, uint32_t num_wait_for)
-{
-    return pyopencl::c_handle_error([&] {
-            *event = enqueue_copy_buffer(
-                static_cast<pyopencl::command_queue*>(queue),
-                static_cast<pyopencl::memory_object_holder*>(src),
-                static_cast<pyopencl::memory_object_holder*>(dst),
-                byte_count, src_offset, dst_offset, wait_for, num_wait_for);
+error*
+enqueue_copy_buffer(clobj_t *_evt, clobj_t _queue, clobj_t _src, clobj_t _dst,
+                    ptrdiff_t byte_count, size_t src_offset, size_t dst_offset,
+                    const clobj_t *_wait_for, uint32_t num_wait_for)
+{
+    auto queue = static_cast<command_queue*>(_queue);
+    auto src = static_cast<memory_object_holder*>(_src);
+    auto dst = static_cast<memory_object_holder*>(_dst);
+    return c_handle_error([&] {
+            if (byte_count < 0) {
+                size_t byte_count_src = 0;
+                size_t byte_count_dst = 0;
+                pyopencl_call_guarded(
+                    clGetMemObjectInfo, src->data(), CL_MEM_SIZE,
+                    sizeof(byte_count), &byte_count_src, NULL);
+                pyopencl_call_guarded(
+                    clGetMemObjectInfo, src->data(), CL_MEM_SIZE,
+                    sizeof(byte_count), &byte_count_dst, NULL);
+                byte_count = std::min(byte_count_src, byte_count_dst);
+            }
+            auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
+            cl_event evt;
+            retry_mem_error<void>([&] {
+                    pyopencl_call_guarded(
+                        clEnqueueCopyBuffer, queue->data(), src->data(),
+                        dst->data(), src_offset, dst_offset, byte_count,
+                        num_wait_for, wait_for.get(), &evt);
+                });
+            *_evt = new_event(evt);
         });
 }
 
 
-::error*
-_enqueue_read_image(clobj_t *event, clobj_t queue, clobj_t mem,
-                    size_t *origin, size_t *region, void *buffer, size_t size,
-                    size_t row_pitch, size_t slice_pitch,
-                    const clobj_t *wait_for, uint32_t num_wait_for,
-                    int is_blocking)
-{
-    return pyopencl::c_handle_error([&] {
-            *event = enqueue_read_image(
-                static_cast<pyopencl::command_queue*>(queue),
-                static_cast<pyopencl::image*>(mem),
-                origin, region, buffer, size, row_pitch, slice_pitch,
-                wait_for, num_wait_for, (bool)is_blocking);
+error*
+enqueue_read_image(clobj_t *_evt, clobj_t _queue, clobj_t _mem, size_t *origin,
+                   size_t *region, void *buffer, size_t row_pitch,
+                   size_t slice_pitch, const clobj_t *_wait_for,
+                   uint32_t num_wait_for, int is_blocking)
+{
+    auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
+    auto queue = static_cast<command_queue*>(_queue);
+    auto img = static_cast<image*>(_mem);
+    return c_handle_error([&] {
+            cl_event evt;
+            retry_mem_error<void>([&] {
+                    pyopencl_call_guarded(
+                        clEnqueueReadImage, queue->data(), img->data(),
+                        cast_bool(is_blocking), origin, region, row_pitch,
+                        slice_pitch, buffer, num_wait_for,
+                        wait_for.get(), &evt);
+                });
+            *_evt = new_event(evt);
+            //PYOPENCL_RETURN_NEW_NANNY_EVENT(evt, buffer);
         });
 }
 
 // }}}
 
-::error*
-_command_queue_finish(clobj_t queue)
-{
-    return pyopencl::c_handle_error([&] {
-            static_cast<pyopencl::command_queue*>(queue)->finish();
-        });
-}
-
-::error*
-_command_queue_flush(clobj_t queue)
-{
-    return pyopencl::c_handle_error([&] {
-            static_cast<pyopencl::command_queue*>(queue)->flush();
-        });
-}
-
 intptr_t
-_int_ptr(clobj_t obj)
+clobj__int_ptr(clobj_t obj)
 {
     return obj->intptr();
 }
 
-::error*
+error*
 _from_int_ptr(clobj_t *ptr_out, intptr_t int_ptr_value, class_t class_)
 {
 #define FROM_INT_PTR(CLSU, CLS)                                         \
-    *ptr_out = new pyopencl::CLS((PYOPENCL_CL_##CLSU)int_ptr_value,     \
+    *ptr_out = new CLS((PYOPENCL_CL_##CLSU)int_ptr_value,     \
                                  /* retain */ true);
 
-    return pyopencl::c_handle_error([&] {
+    return c_handle_error([&] {
             SWITCHCLASS(FROM_INT_PTR);
         });
 }
 
-::error*
-_get_info(clobj_t obj, cl_uint param, generic_info *out)
+error*
+clobj__get_info(clobj_t obj, cl_uint param, generic_info *out)
 {
-    return pyopencl::c_handle_error([&] {
+    return c_handle_error([&] {
             *out = obj->get_info(param);
         });
 }
 
 void
-_delete(clobj_t obj)
+clobj__delete(clobj_t obj)
 {
     delete obj;
 }
 
-::error*
-_release_memobj(clobj_t obj)
-{
-    return pyopencl::c_handle_error([&] {
-            static_cast<pyopencl::memory_object*>(obj)->release();
-        });
-}
-
-int pyopencl_get_cl_version()
-{
-    return PYOPENCL_CL_VERSION;
-}
-
 // {{{ gl interop
 
-int pyopencl_have_gl()
-{
-#ifdef HAVE_GL
-    return 1;
-#else
-    return 0;
-#endif
-}
-
 #ifdef HAVE_GL
 error*
-_create_from_gl_buffer(clobj_t *ptr, clobj_t context,
-                       cl_mem_flags flags, GLuint bufobj)
+create_from_gl_buffer(clobj_t *ptr, clobj_t _ctx,
+                      cl_mem_flags flags, GLuint bufobj)
 {
-    auto ctx = static_cast<pyopencl::context*>(context);
-    return pyopencl::c_handle_error([&] {
+    auto ctx = static_cast<context*>(_ctx);
+    return c_handle_error([&] {
             cl_mem mem = pyopencl_call_guarded(clCreateFromGLBuffer,
                                                ctx->data(), flags, bufobj);
-            *ptr = pyopencl_convert_obj(pyopencl::gl_buffer,
+            *ptr = pyopencl_convert_obj(gl_buffer,
                                         clReleaseMemObject, mem);
         });
 }
 
 error*
-_create_from_gl_renderbuffer(clobj_t *ptr, clobj_t context,
-                             cl_mem_flags flags, GLuint bufobj)
+create_from_gl_renderbuffer(clobj_t *ptr, clobj_t _ctx,
+                            cl_mem_flags flags, GLuint bufobj)
 {
-    auto ctx = static_cast<pyopencl::context*>(context);
-    return pyopencl::c_handle_error([&] {
+    auto ctx = static_cast<context*>(_ctx);
+    return c_handle_error([&] {
             cl_mem mem = pyopencl_call_guarded(clCreateFromGLRenderbuffer,
                                                ctx->data(), flags, bufobj);
-            *ptr = pyopencl_convert_obj(pyopencl::gl_renderbuffer,
+            *ptr = pyopencl_convert_obj(gl_renderbuffer,
                                         clReleaseMemObject, mem);
         });
 }
 
-::error*
-_enqueue_acquire_gl_objects(clobj_t *event, clobj_t queue,
-                            const clobj_t *mem_objects,
-                            uint32_t num_mem_objects,
-                            const clobj_t *wait_for, uint32_t num_wait_for)
-{
-    return pyopencl::c_handle_error([&] {
-            *event = enqueue_gl_objects(
-                Acquire, static_cast<pyopencl::command_queue*>(queue),
+error*
+enqueue_acquire_gl_objects(clobj_t *_evt, clobj_t queue,
+                           const clobj_t *mem_objects,
+                           uint32_t num_mem_objects,
+                           const clobj_t *wait_for, uint32_t num_wait_for)
+{
+    return c_handle_error([&] {
+            *_evt = enqueue_gl_objects(
+                Acquire, static_cast<command_queue*>(queue),
                 mem_objects, num_mem_objects, wait_for, num_wait_for);
         });
 }
 
-::error*
-_enqueue_release_gl_objects(clobj_t *event, clobj_t queue,
-                            const clobj_t *mem_objects,
-                            uint32_t num_mem_objects,
-                            const clobj_t *wait_for, uint32_t num_wait_for)
+error*
+enqueue_release_gl_objects(clobj_t *event, clobj_t queue,
+                           const clobj_t *mem_objects,
+                           uint32_t num_mem_objects,
+                           const clobj_t *wait_for, uint32_t num_wait_for)
 {
-    return pyopencl::c_handle_error([&] {
+    return c_handle_error([&] {
             *event = enqueue_gl_objects(
-                Release, static_cast<pyopencl::command_queue*>(queue),
+                Release, static_cast<command_queue*>(queue),
                 mem_objects, num_mem_objects, wait_for, num_wait_for);
         });
 }
-- 
GitLab