From: Junyan He <junyan...@intel.com> Signed-off-by: Junyan He <junyan...@intel.com> --- src/cl_api.c | 2 +- src/cl_kernel.c | 19 +++++++++---------- src/cl_kernel.h | 8 +++++--- src/cl_utils.h | 2 +- 4 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/src/cl_api.c b/src/cl_api.c index 790e692..9a52ed3 100644 --- a/src/cl_api.c +++ b/src/cl_api.c @@ -1316,7 +1316,7 @@ clGetKernelInfo(cl_kernel kernel, cl_uint n = kernel->arg_n; FILL_GETINFO_RET (cl_uint, 1, &n, CL_SUCCESS); } else if (param_name == CL_KERNEL_REFERENCE_COUNT) { - cl_int ref = kernel->ref_n; + cl_int ref = CL_OBJECT_GET_REF(kernel); FILL_GETINFO_RET (cl_int, 1, &ref, CL_SUCCESS); } else if (param_name == CL_KERNEL_FUNCTION_NAME) { const char * n = cl_kernel_get_name(kernel); diff --git a/src/cl_kernel.c b/src/cl_kernel.c index ccecd83..8fafe42 100644 --- a/src/cl_kernel.c +++ b/src/cl_kernel.c @@ -45,14 +45,16 @@ cl_kernel_delete(cl_kernel k) #ifdef HAS_CMRT if (k->cmrt_kernel != NULL) { cmrt_destroy_kernel(k); - k->magic = CL_MAGIC_DEAD_HEADER; /* For safety */ + CL_OBJECT_DESTROY_BASE(k); cl_free(k); return; } #endif /* We are not done with the kernel */ - if (atomic_dec(&k->ref_n) > 1) return; + if (CL_OBJECT_DEC_REF(k) > 1) + return; + /* Release one reference on all bos we own */ if (k->bo) cl_buffer_unreference(k->bo); /* This will be true for kernels created by clCreateKernel */ @@ -68,7 +70,8 @@ cl_kernel_delete(cl_kernel k) } if (k->image_sz) cl_free(k->images); - k->magic = CL_MAGIC_DEAD_HEADER; /* For safety */ + + CL_OBJECT_DESTROY_BASE(k); cl_free(k); } @@ -77,9 +80,7 @@ cl_kernel_new(cl_program p) { cl_kernel k = NULL; TRY_ALLOC_NO_ERR (k, CALLOC(struct _cl_kernel)); - SET_ICD(k->dispatch) - k->ref_n = 1; - k->magic = CL_MAGIC_KERNEL_HEADER; + CL_OBJECT_INIT_BASE(k, CL_OBJECT_KERNEL_MAGIC); k->program = p; k->cmrt_kernel = NULL; @@ -108,7 +109,7 @@ cl_kernel_get_attributes(cl_kernel k) LOCAL void cl_kernel_add_ref(cl_kernel k) { - atomic_inc(&k->ref_n); + CL_OBJECT_INC_REF(k); } LOCAL cl_int @@ -409,12 +410,10 @@ cl_kernel_dup(cl_kernel from) if (UNLIKELY(from == NULL)) return NULL; TRY_ALLOC_NO_ERR (to, CALLOC(struct _cl_kernel)); - SET_ICD(to->dispatch) + CL_OBJECT_INIT_BASE(to, CL_OBJECT_KERNEL_MAGIC); to->bo = from->bo; to->opaque = from->opaque; to->vme = from->vme; - to->ref_n = 1; - to->magic = CL_MAGIC_KERNEL_HEADER; to->program = from->program; to->arg_n = from->arg_n; to->curbe_sz = from->curbe_sz; diff --git a/src/cl_kernel.h b/src/cl_kernel.h index 05a882e..dd5a842 100644 --- a/src/cl_kernel.h +++ b/src/cl_kernel.h @@ -21,6 +21,7 @@ #define __CL_KERNEL_H__ #include "cl_internals.h" +#include "cl_base_object.h" #include "cl_driver.h" #include "cl_gbe_loader.h" #include "CL/cl.h" @@ -46,9 +47,7 @@ typedef struct cl_argument { /* One OCL function */ struct _cl_kernel { - DEFINE_ICD(dispatch) - uint64_t magic; /* To identify it as a kernel */ - volatile int ref_n; /* We reference count this object */ + _cl_base_object base; cl_buffer bo; /* The code itself */ cl_program program; /* Owns this structure (and pointers) */ gbe_kernel opaque; /* (Opaque) compiler structure for the OCL kernel */ @@ -73,6 +72,9 @@ struct _cl_kernel { void* cmrt_kernel; /* CmKernel* */ }; +#define CL_OBJECT_KERNEL_MAGIC 0x1234567890abedefLL +#define CL_OBJECT_IS_KERNEL(obj) (((cl_base_object)obj)->magic == CL_OBJECT_KERNEL_MAGIC) + /* Allocate an empty kernel */ extern cl_kernel cl_kernel_new(cl_program); diff --git a/src/cl_utils.h b/src/cl_utils.h index 02ccc72..d779955 100644 --- a/src/cl_utils.h +++ b/src/cl_utils.h @@ -251,7 +251,7 @@ do { \ err = CL_INVALID_KERNEL; \ goto error; \ } \ - if (UNLIKELY(KERNEL->magic != CL_MAGIC_KERNEL_HEADER)) { \ + if (UNLIKELY(!CL_OBJECT_IS_KERNEL(KERNEL))) { \ err = CL_INVALID_KERNEL; \ goto error; \ } \ -- 1.7.9.5 ____________________________________________________________ FREE 3D EARTH SCREENSAVER - Watch the Earth right on your desktop! Check it out at http://www.inbox.com/earth _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/beignet