From 23e578fca3ee9e984cba049b0b2dadf5e8f10f05 Mon Sep 17 00:00:00 2001
From: Marko Bencun <mbencun@gmail.com>
Date: Sat, 31 Aug 2013 14:40:36 +0200
Subject: [PATCH] hashing

---
 pyopencl/cache.py            |   4 +-
 pyopencl/cffi_cl.py          |  54 +++++++++----
 src/c_wrapper/wrap_cl.cpp    | 143 ++++++++++++++++++++---------------
 src/c_wrapper/wrap_cl.h      |   3 +-
 src/c_wrapper/wrap_cl_core.h |  55 +++++++-------
 5 files changed, 153 insertions(+), 106 deletions(-)

diff --git a/pyopencl/cache.py b/pyopencl/cache.py
index 0db15d6e..10ea16e0 100644
--- a/pyopencl/cache.py
+++ b/pyopencl/cache.py
@@ -24,7 +24,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
-import pyopencl._cl as _cl
+#import pyopencl._cl as _cl
+import pyopencl.cffi_cl as _cl
 import re
 import sys
 import os
@@ -395,7 +396,6 @@ def _create_built_program_from_source_cached(ctx, src, options, devices, cache_d
         from uuid import uuid4
         src = src + "\n\n__constant int pyopencl_defeat_cache_%s = 0;" % (
                 uuid4().hex)
-
         prg = _cl._Program(ctx, src)
         prg.build(options, [devices[i] for i in to_be_built_indices])
 
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 753bb3d7..d649de4a 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -1,4 +1,4 @@
-from pyopencl._cl import RuntimeError
+#from pyopencl._cl import RuntimeError
 
 import warnings
 
@@ -79,7 +79,6 @@ typedef cl_uint             cl_event_info;
 typedef cl_uint             cl_command_type;
 typedef cl_uint             cl_profiling_info;
 
-
 """
 
 with open(os.path.join(current_directory, 'wrap_cl_core.h')) as _f:
@@ -95,11 +94,14 @@ _lib = _ffi.verify(
     library_dirs=[current_directory],
     libraries=["wrapcl", "OpenCL"])
 
-class PP(object):
+class _CArray(object):
     def __init__(self, ptr):
         self.ptr = ptr
         self.size = _ffi.new('uint32_t *')
 
+    def __del__(self):
+        _lib._free(self.ptr[0])
+        
     def __getitem__(self, key):
         return self.ptr[0].__getitem__(key)
 
@@ -107,8 +109,10 @@ class PP(object):
         for i in xrange(self.size[0]):
             yield self[i]
 
+class _CArrays(_CArray):
     def __del__(self):
-        _lib.freem(self.ptr[0])
+        _lib._free2(_ffi.cast('void**', self.ptr[0]), self.size[0])
+        super(_CArrays, self).__del__()
 
 class CLRuntimeError(RuntimeError):
     def __init__(self, routine, code, msg=""):
@@ -125,8 +129,6 @@ def get_cl_header_version():
     return (v >> (3*4),
             (v >> (1*4)) & 0xff)
         
-_CL_VERSION = get_cl_header_version()
-
 # {{{ expose constants classes like platform_info, device_type, ...
 _constants = {}
 @_ffi.callback('void(const char*, const char* name, unsigned int value)')
@@ -184,7 +186,7 @@ def _parse_context_properties(properties):
     return _ffi.new('cl_context_properties[]', props)
 
         
-class Context(object):
+class Context(EQUALITY_TESTS):
     def __init__(self, devices=None, properties=None, dev_type=None):
         c_props = _parse_context_properties(properties)
         status_code = _ffi.new('cl_int *')
@@ -202,10 +204,13 @@ class Context(object):
 
         self.ptr = ptr_ctx[0]
 
+    def __hash__(self):
+        return _lib.context__hash(self.ptr)
+        
     def get_info(self, param):
         return 'TODO'
 
-class CommandQueue(object):
+class CommandQueue(EQUALITY_TESTS):
     def __init__(self, context, device=None, properties=None):
         if properties is None:
             properties = 0
@@ -213,16 +218,22 @@ class CommandQueue(object):
         _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 __hash__(self):
+        return _lib.command_queue__hash(self.ptr)
+
     def get_info(self, param):
         print param
         raise NotImplementedError()
 
-class MemoryObjectHolder(object):
+class MemoryObjectHolder(EQUALITY_TESTS):
     def get_info(self, param):
         info = _ffi.new('generic_info *')
         _lib.memory_object_holder__get_info(self.ptr, param, info)
         return _generic_info_to_python(info)
 
+    def __hash__(self):
+        return _lib.memory_object_holder__hash(self.ptr)
+        
 class MemoryObject(MemoryObjectHolder):
     pass
         
@@ -251,6 +262,9 @@ class _Program(object):
         else:
             self._init_binary(*args)
 
+    def __hash__(self):
+        return _lib.program__hash(self.ptr)
+
     def int_ptr(self):
         raise NotImplementedError()
 
@@ -290,7 +304,7 @@ class _Program(object):
     def get_info(self, param):
         if param == program_info.DEVICES:
             # todo: refactor, same code as in get_devices 
-            devices = PP(_ffi.new('void**'))
+            devices = _CArray(_ffi.new('void**'))
             _lib.program__get_info__devices(self.ptr, devices.ptr, devices.size)
             result = []
             for i in xrange(devices.size[0]):
@@ -299,17 +313,19 @@ class _Program(object):
                 result.append(_create_device(device_ptr))
             return result
         elif param == program_info.BINARIES:
-            # TODO possible memory leak? the char arrays might not be freed
-            ptr_binaries = PP(_ffi.new('char***'))
+            ptr_binaries = _CArrays(_ffi.new('char***'))
             _lib.program__get_info__binaries(self.ptr, ptr_binaries.ptr, ptr_binaries.size)
             return map(_ffi.string, ptr_binaries)
         print param
         raise NotImplementedError()
         
-class Platform(object):
+class Platform(EQUALITY_TESTS):
     def __init__(self):
         pass
 
+    def __hash__(self):
+        return _lib.platform__hash(self.ptr)
+
     # todo: __del__
 
     def get_info(self, param):
@@ -318,7 +334,7 @@ class Platform(object):
         return _generic_info_to_python(info)
     
     def get_devices(self, device_type=device_type.ALL):
-        devices = PP(_ffi.new('void**'))
+        devices = _CArray(_ffi.new('void**'))
         _lib.platform__get_devices(self.ptr, devices.ptr, devices.size, device_type)
         result = []
         for i in xrange(devices.size[0]):
@@ -351,6 +367,9 @@ class Kernel(object):
         _lib._create_kernel(ptr_kernel, program.ptr, name)
         self.ptr = ptr_kernel[0]
 
+    def __hash__(self):
+        return _lib.kernel__hash(self.ptr)
+        
     def get_info(self, param):
         info = _ffi.new('generic_info *')
         _lib.kernel__get_info(self.ptr, param, info)
@@ -364,7 +383,7 @@ class Kernel(object):
             raise NotImplementedError()
     
 def get_platforms():
-    platforms = PP(_ffi.new('void**'))
+    platforms = _CArray(_ffi.new('void**'))
     _lib.get_platforms(platforms.ptr, platforms.size)
     result = []
     for i in xrange(platforms.size[0]):
@@ -374,9 +393,12 @@ def get_platforms():
         
     return result
 
-class Event(object):
+class Event(EQUALITY_TESTS):
     def __init__(self):
         pass
+        
+    def __hash__(self):
+        return _lib.event__hash(self.ptr)
 
     def get_info(self, param):
         print param
diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp
index 6322f237..3619fa9e 100644
--- a/src/c_wrapper/wrap_cl.cpp
+++ b/src/c_wrapper/wrap_cl.cpp
@@ -6,7 +6,7 @@
 #include <string.h>
 #include <memory>
 
-#define MALLOC(TYPE, VAR, N) TYPE* VAR = reinterpret_cast<TYPE*>(malloc(sizeof(TYPE)*(N)));
+#define MALLOC(TYPE, VAR, N) TYPE *VAR = reinterpret_cast<TYPE*>(malloc(sizeof(TYPE)*(N)));
 
 // {{{ tracing and error reporting
 #ifdef PYOPENCL_TRACE
@@ -173,7 +173,7 @@ int get_cl_version(void) {
 extern "C"
 namespace pyopencl
 {
-  char* _copy_str(const std::string& str) {
+  char *_copy_str(const std::string& str) {
     MALLOC(char, cstr, str.size() + 1);
     strcpy(cstr, str.c_str());
     return cstr;
@@ -318,8 +318,7 @@ namespace pyopencl
       return m_platform;
     }
 
-    // TODO
-    // PYOPENCL_EQUALITY_TESTS(platform);
+    PYOPENCL_EQUALITY_TESTS(platform);
 
     generic_info get_info(cl_platform_info param_name) const
     {
@@ -754,7 +753,7 @@ namespace pyopencl
       return m_context;
     }
 
-    //PYOPENCL_EQUALITY_TESTS(context);
+    PYOPENCL_EQUALITY_TESTS(context);
 
     //       py::object get_info(cl_context_info param_name) const
     //       {
@@ -900,7 +899,7 @@ namespace pyopencl
     const cl_command_queue data() const
     { return m_queue; }
 
-    // PYOPENCL_EQUALITY_TESTS(command_queue);
+    PYOPENCL_EQUALITY_TESTS(command_queue);
 
     // py::object get_info(cl_command_queue_info param_name) const
     // {
@@ -966,7 +965,7 @@ namespace pyopencl
     public:
       virtual const cl_mem data() const = 0;
 
-    //PYOPENCL_EQUALITY_TESTS(memory_object_holder);
+    PYOPENCL_EQUALITY_TESTS(memory_object_holder);
 
       size_t size() const
       {
@@ -1030,10 +1029,10 @@ namespace pyopencl
     private:
       bool m_valid;
       cl_mem m_mem;
-      void* m_hostbuf;
+      void *m_hostbuf;
 
     public:
-      memory_object(cl_mem mem, bool retain, void* hostbuf=0)
+      memory_object(cl_mem mem, bool retain, void *hostbuf=0)
         : m_valid(true), m_mem(mem)
       {
         if (retain)
@@ -1071,7 +1070,7 @@ namespace pyopencl
           release();
       }
 
-      void* hostbuf()
+      void *hostbuf()
       { return m_hostbuf; }
 
       const cl_mem data() const
@@ -1276,7 +1275,7 @@ class buffer : public memory_object
       context &ctx,
       cl_mem_flags flags,
       size_t size,
-      void* py_hostbuf
+      void *py_hostbuf
       )
   {
     
@@ -1339,7 +1338,7 @@ class buffer : public memory_object
         return m_program_kind;
       }
 
-    //PYOPENCL_EQUALITY_TESTS(program);
+    PYOPENCL_EQUALITY_TESTS(program);
 
     std::vector<cl_device_id> get_info__devices()
     {
@@ -1348,7 +1347,7 @@ class buffer : public memory_object
       return result;
     }
 
-    char** get_info__binaries(uint32_t *num_binaries) {
+    char **get_info__binaries(uint32_t *num_binaries) {
       std::vector<size_t> sizes;
       PYOPENCL_GET_VEC_INFO(Program, m_program, CL_PROGRAM_BINARY_SIZES, sizes);
       
@@ -1364,20 +1363,6 @@ class buffer : public memory_object
 			    (m_program, CL_PROGRAM_BINARIES, sizes.size()*sizeof(char *),
 			     result_ptrs, 0)); \
       return result_ptrs;
-//       py::list py_result;
-//       ptr = result.get();
-//       for (unsigned i = 0; i < sizes.size(); ++i) {
-// 	py::handle<> binary_pyobj(
-// #if PY_VERSION_HEX >= 0x03000000
-// 				  PyBytes_FromStringAndSize(
-// 							    reinterpret_cast<char *>(ptr), sizes[i])
-// #else
-// 				  PyString_FromStringAndSize(
-// 							     reinterpret_cast<char *>(ptr), sizes[i])
-// #endif
-// 				  );
-// 	py_result.append(binary_pyobj);
-// 	ptr += sizes[i];
       }
     
 
@@ -1496,7 +1481,7 @@ class buffer : public memory_object
 //         }
 //       }
 
-      void build(char* options, cl_uint num_devices, void** ptr_devices)
+      void build(char *options, cl_uint num_devices, void **ptr_devices)
       { 
 	// todo: this function should get a list of device instances, not raw pointers
 	// pointers are for the cffi interface and should not be here
@@ -1782,7 +1767,7 @@ class buffer : public memory_object
   event *enqueue_read_buffer(
       command_queue &cq,
       memory_object_holder &mem,
-      void* buffer,
+      void *buffer,
       size_t size, 
       size_t device_offset,
       /*py::object py_wait_for,*/
@@ -1855,9 +1840,9 @@ 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 size_t *global_work_offset,
+      const size_t *global_work_size,
+      const size_t *local_work_size //,
       //py::object py_global_work_offset,
       //py::object py_wait_for,
 				      )
@@ -1915,9 +1900,9 @@ inline event *enqueue_nd_range_kernel(
   program *create_program_with_binary(
       context &ctx,
       cl_uint num_devices, 
-      void** ptr_devices,
+      void **ptr_devices,
       cl_uint num_binaries,
-      char** binaries)
+      char **binaries)
   {
     std::vector<cl_device_id> devices;
     std::vector<size_t> sizes;
@@ -1960,7 +1945,7 @@ inline event *enqueue_nd_range_kernel(
 
   
 
-  void* get_platforms(void** ptr_platforms, uint32_t *num_platforms) {
+  void *get_platforms(void **ptr_platforms, uint32_t *num_platforms) {
     *num_platforms = 0;
     PYOPENCL_CALL_GUARDED(clGetPlatformIDs, (0, 0, num_platforms));
 
@@ -1977,18 +1962,24 @@ inline event *enqueue_nd_range_kernel(
     return 0;
   }
 
-  void freem(void* p) {
+  void _free(void *p) {
     free(p);
   }
 
-  void* platform__get_info(void* ptr_platform, cl_platform_info param, generic_info* out) {
+  void _free2(void **p, uint32_t size) {
+    for(uint32_t i = 0; i < size; ++i) {
+      _free(p[i]);
+    }
+  }
+
+  void *platform__get_info(void *ptr_platform, cl_platform_info param, generic_info *out) {
     // todo: catch error
     *out = static_cast<platform*>(ptr_platform)->get_info(param);
     //*out = _copy_str(static_cast<platform*>(ptr_platform)->get_info(param_name));
     return 0;
   }
 
-  void* platform__get_devices(void* ptr_platform, void** ptr_devices, uint32_t* num_devices, cl_device_type devtype) {
+  void *platform__get_devices(void *ptr_platform, void **ptr_devices, uint32_t *num_devices, cl_device_type devtype) {
     typedef std::vector<cl_device_id> vec;
     
     // todo: catch error
@@ -2003,14 +1994,19 @@ inline event *enqueue_nd_range_kernel(
     
     return 0;
   }
+  
+  long platform__hash(void *ptr_platform) {
+    return static_cast<platform*>(ptr_platform)->hash();
+  }
 
-  void* device__get_info(void* ptr_device, cl_device_info param, generic_info* out) {
+
+  void *device__get_info(void *ptr_device, cl_device_info param, generic_info *out) {
     // todo: catch error
     *out = static_cast<device*>(ptr_device)->get_info(param);
     return 0;
   }
 
-  void* _create_context(void** ptr_ctx, cl_context_properties* properties, cl_uint num_devices, void** ptr_devices) {
+  void *_create_context(void **ptr_ctx, cl_context_properties *properties, cl_uint num_devices, void **ptr_devices) {
   
     cl_int status_code;
     std::vector<cl_device_id> devices(num_devices);
@@ -2031,48 +2027,48 @@ inline event *enqueue_nd_range_kernel(
     return 0;
   }
 
-  void* _create_command_queue(void** ptr_command_queue, void* ptr_context, void* ptr_device, cl_command_queue_properties properties) {
+  void *_create_command_queue(void **ptr_command_queue, void *ptr_context, void *ptr_device, cl_command_queue_properties properties) {
     // todo error handling
-    context* ctx = static_cast<context*>(ptr_context);
-    device* dev = static_cast<device*>(ptr_device);
+    context *ctx = static_cast<context*>(ptr_context);
+    device *dev = static_cast<device*>(ptr_device);
     *ptr_command_queue = new command_queue(*ctx, dev, properties);
     return 0;
   }
 
-  void* _create_buffer(void** ptr_buffer, void* ptr_context, cl_mem_flags flags, size_t size, void* hostbuf) {
-    context* ctx = static_cast<context*>(ptr_context);
+  void *_create_buffer(void **ptr_buffer, void *ptr_context, cl_mem_flags flags, size_t size, void *hostbuf) {
+    context *ctx = static_cast<context*>(ptr_context);
     *ptr_buffer = create_buffer_py(*ctx, flags, size, hostbuf);
     // todo error handling
     return 0;
   }
 
-  void* _create_program_with_source(void **ptr_program, void *ptr_context, char* src) {
-    context* ctx = static_cast<context*>(ptr_context);
+  void *_create_program_with_source(void **ptr_program, void *ptr_context, char *src) {
+    context *ctx = static_cast<context*>(ptr_context);
     *ptr_program = create_program_with_source(*ctx, src);
     // todo error handling
     return 0;
   }
 
-  void* _create_program_with_binary(void **ptr_program, void *ptr_context, cl_uint num_devices, void** ptr_devices, cl_uint num_binaries, char** binaries) {
+  void *_create_program_with_binary(void **ptr_program, void *ptr_context, cl_uint num_devices, void **ptr_devices, cl_uint num_binaries, char **binaries) {
     // todo: catch error
-    context* ctx = static_cast<context*>(ptr_context);
+    context *ctx = static_cast<context*>(ptr_context);
     *ptr_program = create_program_with_binary(*ctx, num_devices, ptr_devices, num_binaries, binaries);
     return 0;
   }
 
-  void* program__build(void* ptr_program, char* options, cl_uint num_devices, void** ptr_devices) {
+  void *program__build(void *ptr_program, char *options, cl_uint num_devices, void **ptr_devices) {
     // todo: catch error
     static_cast<program*>(ptr_program)->build(options, num_devices, ptr_devices);
     return 0;
   }
 
-  void* program__kind(void* ptr_program, int *kind) {
+  void *program__kind(void *ptr_program, int *kind) {
     // todo: catch error
     *kind = static_cast<program*>(ptr_program)->kind();
     return 0;
   }
 
-  void* program__get_info__devices(void* ptr_program, void** ptr_devices, uint32_t* num_devices) {
+  void *program__get_info__devices(void *ptr_program, void **ptr_devices, uint32_t *num_devices) {
 
     typedef std::vector<cl_device_id> vec;
 
@@ -2092,37 +2088,62 @@ inline event *enqueue_nd_range_kernel(
     
   }
 
-  void* program__get_info__binaries(void* ptr_program, char*** ptr_binaries, uint32_t* num_binaries) {
+  void *program__get_info__binaries(void *ptr_program, char ***ptr_binaries, uint32_t *num_binaries) {
     // todo catch error
     *ptr_binaries = static_cast<program*>(ptr_program)->get_info__binaries(num_binaries);
     return 0;
   }
+  
 
   long device__hash(void *ptr_device) {
     return static_cast<device*>(ptr_device)->hash();
   }
 
-  void* _create_kernel(void** ptr_kernel, void* ptr_program, char* name) {
-    program* prg = static_cast<program*>(ptr_program);
+  long context__hash(void *ptr_context) {
+    return static_cast<context*>(ptr_context)->hash();
+  }
+
+  long command_queue__hash(void *ptr_command_queue) {
+    return static_cast<command_queue*>(ptr_command_queue)->hash();
+  }
+
+  long event__hash(void *ptr_event) {
+    return static_cast<event*>(ptr_event)->hash();
+  }
+
+  long memory_object_holder__hash(void *ptr_memory_object_holder) {
+    return static_cast<memory_object_holder*>(ptr_memory_object_holder)->hash();
+  }
+
+  long program__hash(void *ptr_program) {
+    return static_cast<program*>(ptr_program)->hash();
+  }
+  
+  long kernel__hash(void *ptr_kernel) {
+    return static_cast<kernel*>(ptr_kernel)->hash();
+  }
+  
+  void *_create_kernel(void **ptr_kernel, void *ptr_program, char *name) {
+    program *prg = static_cast<program*>(ptr_program);
     *ptr_kernel = new kernel(*prg, name);
     // todo error handling
     return 0;
   }
 
-  void* kernel__get_info(void* ptr_kernel, cl_kernel_info param, generic_info* out) {
+  void *kernel__get_info(void *ptr_kernel, cl_kernel_info param, generic_info *out) {
     *out = static_cast<kernel*>(ptr_kernel)->get_info(param);
     // todo error handling
     return 0;
   }
 
-  void* kernel__set_arg_mem_buffer(void* ptr_kernel, cl_uint arg_index, void* ptr_buffer) {
-    buffer* buf = static_cast<buffer*>(ptr_buffer);
+  void *kernel__set_arg_mem_buffer(void *ptr_kernel, cl_uint arg_index, void *ptr_buffer) {
+    buffer *buf = static_cast<buffer*>(ptr_buffer);
     static_cast<kernel*>(ptr_kernel)->set_arg_mem(arg_index, *buf);
     // todo error handling
     return 0;
   }
 
-  void* _enqueue_nd_range_kernel(void **ptr_event, void* ptr_command_queue, void* ptr_kernel, cl_uint work_dim, const size_t* global_work_offset, const size_t* global_work_size, const size_t* local_work_size) {
+  void *_enqueue_nd_range_kernel(void **ptr_event, void *ptr_command_queue, void *ptr_kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size) {
     *ptr_event = enqueue_nd_range_kernel(*static_cast<command_queue*>(ptr_command_queue),
 					 *static_cast<kernel*>(ptr_kernel),
 					 work_dim,
@@ -2135,7 +2156,7 @@ inline event *enqueue_nd_range_kernel(
   }
 
 
-  void* _enqueue_read_buffer(void **ptr_event, void* ptr_command_queue, void* ptr_memory_object_holder, void* buffer, size_t size, size_t device_offset, int is_blocking) {
+  void *_enqueue_read_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_memory_object_holder, void *buffer, size_t size, size_t device_offset, int is_blocking) {
     *ptr_event = enqueue_read_buffer(*static_cast<command_queue*>(ptr_command_queue),
 				     *static_cast<memory_object_holder*>(ptr_memory_object_holder),
 				     buffer, size, device_offset, (bool)is_blocking);
@@ -2143,7 +2164,7 @@ inline event *enqueue_nd_range_kernel(
     return 0;
   }
   
-  void* memory_object_holder__get_info(void* ptr_memory_object_holder, cl_mem_info param, generic_info* out) {
+  void *memory_object_holder__get_info(void *ptr_memory_object_holder, cl_mem_info param, generic_info *out) {
     *out = static_cast<memory_object_holder*>(ptr_memory_object_holder)->get_info(param);
     // todo error handling
     return 0;
diff --git a/src/c_wrapper/wrap_cl.h b/src/c_wrapper/wrap_cl.h
index 3abd74cf..ce039d14 100644
--- a/src/c_wrapper/wrap_cl.h
+++ b/src/c_wrapper/wrap_cl.h
@@ -63,7 +63,8 @@
 extern "C" {
 #endif
 
-  #include "wrap_cl_core.h"
+#include "wrap_cl_core.h"
+  
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/c_wrapper/wrap_cl_core.h b/src/c_wrapper/wrap_cl_core.h
index b0f8d7fa..1a48511a 100644
--- a/src/c_wrapper/wrap_cl_core.h
+++ b/src/c_wrapper/wrap_cl_core.h
@@ -11,38 +11,41 @@ typedef struct {
   union value_t {
     cl_uint _cl_uint;
     cl_mem_object_type _cl_mem_object_type;
-    char* _chars;
+    char *_chars;
   } value;
 } generic_info;
 
 int get_cl_version(void);
-void* get_platforms(void** ptr_platforms, uint32_t* num_platforms);
-void* platform__get_info(void* ptr_platform, cl_platform_info param_name, generic_info* out);
-void* platform__get_devices(void* ptr_platform, void** ptr_devices, uint32_t* num_devices, cl_device_type devtype);
-void* device__get_info(void* ptr_device, cl_device_info param_name, generic_info* out);
+void *get_platforms(void **ptr_platforms, uint32_t *num_platforms);
+void *platform__get_info(void *ptr_platform, cl_platform_info param_name, generic_info *out);
+void *platform__get_devices(void *ptr_platform, void **ptr_devices, uint32_t *num_devices, cl_device_type devtype);
+long platform__hash(void *ptr_platform);
+void *device__get_info(void *ptr_device, cl_device_info param_name, generic_info *out);
 long device__hash(void *ptr_device);
-void* _create_context(void** ptr_ctx, cl_context_properties* properties, cl_uint num_devices, void** ptr_devices);
-void* _create_command_queue(void** ptr_command_queue, void* ptr_context, void* ptr_device, cl_command_queue_properties properties);
-void* _create_buffer(void** ptr_buffer, void* ptr_context, cl_mem_flags flags, size_t size, void* hostbuf);
-void* _create_program_with_source(void **ptr_program, void *ptr_context, char* src);
-void* _create_program_with_binary(void **ptr_program, void *ptr_context, cl_uint num_devices, void** ptr_devices, cl_uint num_binaries, char** binaries);
-void* program__build(void* ptr_program, char* options, cl_uint num_devices, void** ptr_devices);
-void* program__kind(void* ptr_program, int *kind);
-void* program__get_info__devices(void* ptr_program, void** ptr_devices, uint32_t* num_devices);
-void* program__get_info__binaries(void* ptr_program, char*** ptr_binaries, uint32_t* num_binaries);
-void* _create_kernel(void** ptr_kernel, void* ptr_program, char* name);
-void* kernel__get_info(void *ptr_kernel, cl_kernel_info param, generic_info* out);
-void* kernel__set_arg_mem_buffer(void* ptr_kernel, cl_uint arg_index, void* ptr_buffer);
-void* _enqueue_nd_range_kernel(void **ptr_event, void* ptr_command_queue, void* ptr_kernel, cl_uint work_dim, const size_t* global_work_offset, const size_t* global_work_size, const size_t* local_work_size);
-void* _enqueue_read_buffer(void **ptr_event, void* ptr_command_queue, void* ptr_memory_object_holder, void* buffer, size_t size, size_t device_offset, int is_blocking);
-void* memory_object_holder__get_info(void* ptr_memory_object_holder, cl_mem_info param, generic_info* out);
+long context__hash(void *ptr_context);
+long command_queue__hash(void *ptr_command_queue);
+long event__hash(void *ptr_event);
+void *_create_context(void **ptr_ctx, cl_context_properties *properties, cl_uint num_devices, void **ptr_devices);
+void *_create_command_queue(void **ptr_command_queue, void *ptr_context, void *ptr_device, cl_command_queue_properties properties);
+void *_create_buffer(void **ptr_buffer, void *ptr_context, cl_mem_flags flags, size_t size, void *hostbuf);
+void *_create_program_with_source(void **ptr_program, void *ptr_context, char *src);
+void *_create_program_with_binary(void **ptr_program, void *ptr_context, cl_uint num_devices, void **ptr_devices, cl_uint num_binaries, char **binaries);
+void *program__build(void *ptr_program, char *options, cl_uint num_devices, void **ptr_devices);
+void *program__kind(void *ptr_program, int *kind);
+void *program__get_info__devices(void *ptr_program, void **ptr_devices, uint32_t *num_devices);
+void *program__get_info__binaries(void *ptr_program, char ***ptr_binaries, uint32_t *num_binaries);
+long program__hash(void *ptr_program);
+void *_create_kernel(void **ptr_kernel, void *ptr_program, char *name);
+void *kernel__get_info(void *ptr_kernel, cl_kernel_info param, generic_info *out);
+void *kernel__set_arg_mem_buffer(void *ptr_kernel, cl_uint arg_index, void *ptr_buffer);
+long kernel__hash(void *ptr_kernel);
+void *_enqueue_nd_range_kernel(void **ptr_event, void *ptr_command_queue, void *ptr_kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size);
+void *_enqueue_read_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_memory_object_holder, void *buffer, size_t size, size_t device_offset, int is_blocking);
+void *memory_object_holder__get_info(void *ptr_memory_object_holder, cl_mem_info param, generic_info *out);
+long memory_object_holder__hash(void *ptr_memory_object_holder);
 void populate_constants(void(*add)(const char*, const char*, unsigned int value));
-void freem(void*);
-
-
-
-
-
+void _free(void*);
+void _free2(void**, uint32_t size);
 
 
 
-- 
GitLab