diff options
author | Junyan He <junyan.he@linux.intel.com> | 2013-07-12 16:02:32 +0800 |
---|---|---|
committer | Zhigang Gong <zhigang.gong@linux.intel.com> | 2013-07-16 14:00:04 +0800 |
commit | 0022b3b5bfac2a4850398f63b843e0d24d579f03 (patch) | |
tree | 02274e04ed58bd6421b98101fd4801c96c605d68 | |
parent | 1ea196653abe759239896580ec89702c2e5f9a28 (diff) | |
download | beignet-0022b3b5bfac2a4850398f63b843e0d24d579f03.tar.gz |
Add the support for clSetMemObjectDestructorCallback API
Reviewed-by: "Xing, Homer" <homer.xing@intel.com>
-rw-r--r-- | src/cl_api.c | 20 | ||||
-rw-r--r-- | src/cl_mem.c | 10 | ||||
-rw-r--r-- | 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 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 */ |