[10/11] Runtime: Apply base_object to cl_kernel

Submitted by junyan.he@inbox.com on July 19, 2016, 11:25 a.m.

Details

Message ID 1468927557-5051-10-git-send-email-junyan.he@inbox.com
State New
Headers show
Series "Series without cover letter" ( rev: 1 ) in Beignet

Browsing this patch as part of:
"Series without cover letter" rev 1 in Beignet
<< prev patch [10/11] next patch >>

Commit Message

junyan.he@inbox.com July 19, 2016, 11:25 a.m.
From: Junyan He <junyan.he@intel.com>

Signed-off-by: Junyan He <junyan.he@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(-)

Patch hide | download patch | download mbox

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;                                             \
   }                                                         \