From 0022b3b5bfac2a4850398f63b843e0d24d579f03 Mon Sep 17 00:00:00 2001 From: Junyan He Date: Fri, 12 Jul 2013 16:02:32 +0800 Subject: [PATCH] Add the support for clSetMemObjectDestructorCallback API Reviewed-by: "Xing, Homer" --- 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..b554f8f 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 */ -- 2.7.4