From 322ffb40ce887305f1a629464608f8542051eec0 Mon Sep 17 00:00:00 2001 From: Junyan He Date: Thu, 21 Apr 2016 14:58:03 +0800 Subject: mutex --- libclapi/CMakeLists.txt | 1 + libclapi/cl_mem.c | 2 -- libclapi/cl_mutex.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ libclapi/cl_mutex.h | 50 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 libclapi/cl_mutex.c create mode 100644 libclapi/cl_mutex.h diff --git a/libclapi/CMakeLists.txt b/libclapi/CMakeLists.txt index cf37040a..4f644e7c 100644 --- a/libclapi/CMakeLists.txt +++ b/libclapi/CMakeLists.txt @@ -15,6 +15,7 @@ set(LIBCLAPI_SRC cl_kernel.c cl_extension.c cl_event.c + cl_mutex.c ) add_library(clapi SHARED ${LIBCLAPI_SRC}) diff --git a/libclapi/cl_mem.c b/libclapi/cl_mem.c index 31a75f1a..14f20da7 100644 --- a/libclapi/cl_mem.c +++ b/libclapi/cl_mem.c @@ -629,10 +629,8 @@ static cl_int cl_enqueue_unmap_mem(cl_command_queue queue, cl_mem memobj, void * CL_FREE(memobj->mapped_ptr); memobj->mapped_ptr = new_ptr; } - pthread_mutex_unlock(&memobj->lock); index = cl_context_get_device_index(queue->ctx, queue->device); - pthread_mutex_lock(&memobj->lock); memobj->enqueued_devices[index] = CL_TRUE; pthread_mutex_unlock(&memobj->lock); diff --git a/libclapi/cl_mutex.c b/libclapi/cl_mutex.c new file mode 100644 index 00000000..e9502c7f --- /dev/null +++ b/libclapi/cl_mutex.c @@ -0,0 +1,55 @@ +/* + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + */ +#include +#include +#include +#include +#include +#include "cl_mutex.h" +#include "cl_internals.h" + +static pthread_mutex_t cl_mutex_log_lock; +static unsigned int cl_mutex_log_num; + +typedef struct _cl_mutex_log_item { + pthread_mutex_t* mutex; + char* file; + int line; +} _cl_mutex_log_item; +typedef struct _cl_mutex_log_item* cl_mutex_log_item; + + +static int try_to_get_the_lock(pthread_mutex_t* mutex) +{ + struct timespec abs_time; + clock_gettime(CLOCK_REALTIME , &abs_time); + // so many seconds, still not get, we think deadlock happened. + abs_time.tv_sec += 25; + if (pthread_mutex_timedlock(mutex, &abs_time) != 0) { + return 0; + } + return 1; +} + +LOCAL void cl_mutex_lock(pthread_mutex_t* mutex) +{ + assert(mutex); + + +} + diff --git a/libclapi/cl_mutex.h b/libclapi/cl_mutex.h new file mode 100644 index 00000000..fde52f30 --- /dev/null +++ b/libclapi/cl_mutex.h @@ -0,0 +1,50 @@ +/* + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Author: Benjamin Segovia + */ + +#ifndef __CL_ALLOC_H__ +#define __CL_ALLOC_H__ + +#include + +/* Return a valid pointer for the requested memory block size */ +extern void* cl_malloc(size_t sz, char* file, int line); +#define CL_MALLOC(SZ) cl_malloc(SZ, __FILE__, __LINE__) + +/* Aligned malloc */ +extern void* cl_aligned_malloc(size_t sz, size_t align, char* file, int line); +#define CL_ALIGNED_MALLOC(SZ, ALIGN) cl_aligned_malloc(SZ, ALIGN, __FILE__, __LINE__) + +/* malloc + memzero */ +extern void* cl_calloc(size_t n, size_t elem_size, char* file, int line); +#define CL_CALLOC(N, ELEM_SIZE) cl_calloc(N, ELEM_SIZE, __FILE__, __LINE__) + +/* Regular realloc */ +extern void* cl_realloc(void *ptr, size_t sz, char* file, int line); +#define CL_REALLOC(PTR, SZ) cl_realloc(PTR, SZ, __FILE__, __LINE__) + +/* Free a pointer allocated with cl_*alloc */ +extern void cl_free(void *ptr, char* file, int line); +#define CL_FREE(PTR) cl_free(PTR, __FILE__, __LINE__) + +/* We count the number of allocation. This function report the number of + * allocation still unfreed + */ +extern void cl_alloc_report_unfreed(void); +extern void cl_alloc_debug_init(void); +#endif /* __CL_ALLOC_H__ */ -- cgit v1.2.3