mem_in_buffers is not a good name for this function. You could put the magic number check into this function and rename this function to is_valid_mem() which is better.
On Thu, Sep 11, 2014 at 06:34:12AM +0800, xionghu....@intel.com wrote: > From: Luo Xionghu <xionghu....@intel.com> > > the memory object should be checked whether valid in context buffers before > being set as kernel arguments. > > Signed-off-by: Luo Xionghu <xionghu....@intel.com> > --- > src/cl_kernel.c | 4 ++++ > src/cl_mem.c | 12 ++++++++++++ > src/cl_mem.h | 3 +++ > 3 files changed, 19 insertions(+) > > diff --git a/src/cl_kernel.c b/src/cl_kernel.c > index 5ab9c55..8eec907 100644 > --- a/src/cl_kernel.c > +++ b/src/cl_kernel.c > @@ -99,6 +99,7 @@ cl_kernel_set_arg(cl_kernel k, cl_uint index, size_t sz, > const void *value) > enum gbe_arg_type arg_type; /* kind of argument */ > size_t arg_sz; /* size of the argument */ > cl_mem mem = NULL; /* for __global, __constant and image > arguments */ > + cl_context ctx = k->program->ctx; > > if (UNLIKELY(index >= k->arg_n)) > return CL_INVALID_ARG_INDEX; > @@ -136,6 +137,9 @@ cl_kernel_set_arg(cl_kernel k, cl_uint index, size_t sz, > const void *value) > if(value != NULL) > mem = *(cl_mem*)value; > if(value != NULL && mem) { > + if (!mem_in_buffers(mem, ctx->buffers)) > + return CL_INVALID_ARG_VALUE; > + > if (UNLIKELY(mem->magic != CL_MAGIC_MEM_HEADER)) > return CL_INVALID_MEM_OBJECT; > > diff --git a/src/cl_mem.c b/src/cl_mem.c > index 11411d9..d4bbe2c 100644 > --- a/src/cl_mem.c > +++ b/src/cl_mem.c > @@ -289,6 +289,18 @@ error: > > } > > +LOCAL cl_bool > +mem_in_buffers(cl_mem mem, cl_mem buffers) > +{ > + cl_mem tmp = buffers; > + while(tmp){ > + if(mem == tmp) > + return CL_TRUE; > + tmp = tmp->next; > + } > + return CL_FALSE; > +} > + > LOCAL cl_mem > cl_mem_new_buffer(cl_context ctx, > cl_mem_flags flags, > diff --git a/src/cl_mem.h b/src/cl_mem.h > index 57f38f1..3bcad18 100644 > --- a/src/cl_mem.h > +++ b/src/cl_mem.h > @@ -177,6 +177,9 @@ extern cl_int cl_get_mem_object_info(cl_mem, cl_mem_info, > size_t, void *, size_t > /* Query information about an image */ > extern cl_int cl_get_image_info(cl_mem, cl_image_info, size_t, void *, > size_t *); > > +/* Query whether mem is in buffers */ > +extern cl_bool mem_in_buffers(cl_mem mem, cl_mem buffers); > + > /* Create a new memory object and initialize it with possible user data */ > extern cl_mem cl_mem_new_buffer(cl_context, cl_mem_flags, size_t, void*, > cl_int*); > > -- > 1.7.9.5 > > _______________________________________________ > Beignet mailing list > Beignet@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/beignet