[Beignet] [PATCH] Add the support for clSetMemObjectDestructorCallback API

Xing, Homer homer.xing at intel.com
Fri Jul 12 01:13:08 PDT 2013


This patch looks good to me.

-----Original Message-----
From: beignet-bounces+homer.xing=intel.com at lists.freedesktop.org [mailto:beignet-bounces+homer.xing=intel.com at lists.freedesktop.org] On Behalf Of junyan.he at inbox.com
Sent: Friday, July 12, 2013 4:03 PM
To: beignet at lists.freedesktop.org
Cc: Junyan He
Subject: [Beignet] [PATCH] Add the support for clSetMemObjectDestructorCallback API

From: Junyan He <junyan.he at linux.intel.com>

---
 src/cl_api.c |   20 ++++++++++++++++++--
 src/cl_mem.c |   10 ++++++++++
 src/cl_mem.h |    7 +++++++
 3 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/src/cl_api.c b/src/cl_api.c index 20cbc1e..03cad52 100644
--- a/src/cl_api.c
+++ b/src/cl_api.c
@@ -585,8 +585,24 @@ clSetMemObjectDestructorCallback(cl_mem  memobj,
                                  void (CL_CALLBACK *pfn_notify) (cl_mem, void*),
                                  void * user_data)  {
-  NOT_IMPLEMENTED;
-  return 0;
+  cl_int err = CL_SUCCESS;
+  CHECK_MEM(memobj);
+  INVALID_VALUE_IF (pfn_notify == 0);
+
+  cl_mem_dstr_cb *cb = (cl_mem_dstr_cb*)malloc(sizeof(cl_mem_dstr_cb));
+  if (!cb) {
+    err = CL_OUT_OF_HOST_MEMORY;
+    goto error;
+  }
+
+  memset(cb, 0, sizeof(cl_mem_dstr_cb));  cb->pfn_notify = pfn_notify;  
+ cb->user_data = user_data;  cb->next = memobj->dstr_cb;  
+ memobj->dstr_cb = cb;
+
+error:
+  return err;
 }
 
 cl_sampler
diff --git a/src/cl_mem.c b/src/cl_mem.c index 9691ba3..5af16e0 100644
--- a/src/cl_mem.c
+++ b/src/cl_mem.c
@@ -498,6 +498,16 @@ cl_mem_delete(cl_mem mem)
   if (mem->mapped_ptr)
     free(mem->mapped_ptr);
 
+  if (mem->dstr_cb) {
+    cl_mem_dstr_cb *cb = mem->dstr_cb;
+    while (mem->dstr_cb) {
+      cb = mem->dstr_cb;
+      cb->pfn_notify(mem, cb->user_data);
+      mem->dstr_cb = cb->next;
+      free(cb);
+    }
+  }
+
   cl_free(mem);
 }
 
diff --git a/src/cl_mem.h b/src/cl_mem.h index 66518a6..1b1709a 100644
--- a/src/cl_mem.h
+++ b/src/cl_mem.h
@@ -55,6 +55,12 @@ typedef struct _cl_mapped_ptr {
   size_t size;
 }cl_mapped_ptr;
 
+typedef struct _cl_mem_dstr_cb {
+  struct _cl_mem_dstr_cb * next;
+  void (CL_CALLBACK *pfn_notify)(cl_mem memobj, void *user_data);
+  void *user_data;
+}cl_mem_dstr_cb;
+
 /* Used for buffers and images */
 struct _cl_mem {
   DEFINE_ICD(dispatch)
@@ -78,6 +84,7 @@ struct _cl_mem {
   cl_mapped_ptr* mapped_ptr;/* Store the mapped addresses and size by caller. */
   int mapped_ptr_sz;        /* The array size of mapped_ptr. */
   int map_ref;              /* The mapped count. */
+  cl_mem_dstr_cb *dstr_cb;  /* The destroy callback. */
 };
 
 /* Query information about a memory object */
--
1.7.9.5

_______________________________________________
Beignet mailing list
Beignet at lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list