summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunyan He <junyan.he@linux.intel.com>2013-07-12 16:02:32 +0800
committerZhigang Gong <zhigang.gong@linux.intel.com>2013-07-16 14:00:04 +0800
commit0022b3b5bfac2a4850398f63b843e0d24d579f03 (patch)
tree02274e04ed58bd6421b98101fd4801c96c605d68
parent1ea196653abe759239896580ec89702c2e5f9a28 (diff)
downloadbeignet-0022b3b5bfac2a4850398f63b843e0d24d579f03.tar.gz
Add the support for clSetMemObjectDestructorCallback API
Reviewed-by: "Xing, Homer" <homer.xing@intel.com>
-rw-r--r--src/cl_api.c20
-rw-r--r--src/cl_mem.c10
-rw-r--r--src/cl_mem.h7
3 files changed, 35 insertions, 2 deletions
diff --git a/src/cl_api.c b/src/cl_api.c
index 20cbc1e5..03cad52c 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 9691ba32..b554f8f9 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 66518a63..1b1709a8 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 */