summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunyan He <junyan.he@intel.com>2016-04-21 00:38:04 +0800
committerJunyan He <junyan.he@intel.com>2016-04-21 00:38:04 +0800
commitc64f7afc8a79c8e231d4955b57b8684d0b1e1800 (patch)
tree72e1079b136a3015ff44c12e4806d479d8907f74
parenta35bda1971da8825a742f997fbb337f7106a309c (diff)
alloc free
-rw-r--r--libclapi/cl_alloc.c129
-rw-r--r--libclapi/cl_alloc.h17
-rw-r--r--libclapi/cl_context.c2
3 files changed, 110 insertions, 38 deletions
diff --git a/libclapi/cl_alloc.c b/libclapi/cl_alloc.c
index f3566685..2dabd3d5 100644
--- a/libclapi/cl_alloc.c
+++ b/libclapi/cl_alloc.c
@@ -23,88 +23,155 @@
#include "cl_alloc.h"
#include "cl_internals.h"
-static volatile int cl_alloc_n = 0;
static pthread_mutex_t cl_alloc_log_lock;
typedef struct _cl_alloc_log_item {
void* ptr;
- char* where;
+ size_t size;
+ char* file;
+ int line;
} _cl_alloc_log_item;
typedef struct _cl_alloc_log_item* cl_alloc_log_item;
-static cl_alloc_log_item* cl_alloc_log_map = NULL;
-static int cl_alloc_log_map_size;
+static cl_alloc_log_item* cl_alloc_log_map[8];
+static int cl_alloc_log_map_size[8];
LOCAL void cl_alloc_log_init(void)
{
static int inited = 0;
+ int i;
if (inited)
return;
- cl_alloc_log_map_size = 1024;
- cl_alloc_log_map = malloc(cl_alloc_log_map_size*sizeof(cl_alloc_log_item));
- memset(cl_alloc_log_map, 0, cl_alloc_log_map_size*sizeof(cl_alloc_log_item));
pthread_mutex_init(&cl_alloc_log_lock, NULL);
+
+ for (i = 0; i < 8; i++) {
+ cl_alloc_log_map_size[i] = 128;
+ cl_alloc_log_map[i] = malloc(cl_alloc_log_map_size[i]*sizeof(cl_alloc_log_item));
+ memset(cl_alloc_log_map[i], 0, cl_alloc_log_map_size[i]*sizeof(cl_alloc_log_item));
+ }
+
inited = 1;
}
-LOCAL void*
-cl_malloc(size_t sz)
+static void insert_alloc_log_item(void* ptr, size_t sz, char* file, int line)
{
- void * p = NULL;
- atomic_inc(&cl_alloc_n);
- p = malloc(sz);
+ cl_long slot;
+ int i;
+
+ slot = (cl_long)ptr;
+ slot = (slot>>5) & 0x07;
+ assert(slot < 8);
+
+ cl_alloc_log_item it = malloc(sizeof(cl_alloc_log_item));
+ assert(it);
+ it->ptr = ptr;
+ it->size = sz;
+ it->file = file;
+ it->line = line;
+
+ pthread_mutex_lock(&cl_alloc_log_lock);
+ for (i = 0; i < cl_alloc_log_map_size[slot]; i++) {
+ if (cl_alloc_log_map[slot][i] == NULL) {
+ break;
+ }
+ }
+
+ if (i == cl_alloc_log_map_size[slot]) {
+ cl_alloc_log_map[slot] =
+ realloc(cl_alloc_log_map[slot], 2*cl_alloc_log_map_size[slot]*sizeof(cl_alloc_log_item));
+ memset(cl_alloc_log_map[slot] + cl_alloc_log_map_size[slot], 0,
+ cl_alloc_log_map_size[slot]*sizeof(cl_alloc_log_item));
+ cl_alloc_log_map_size[slot] = cl_alloc_log_map_size[slot]*2;
+ }
+
+ cl_alloc_log_map[slot][i] = it;
+ pthread_mutex_unlock(&cl_alloc_log_lock);
+}
+
+static void delete_alloc_log_item(void* ptr, char* file, int line)
+{
+ cl_long slot;
+ int i;
+
+ slot = (cl_long)ptr;
+ slot = (slot>>5) & 0x07;
+ assert(slot < 8);
+
+ pthread_mutex_lock(&cl_alloc_log_lock);
+ for (i = 0; i < cl_alloc_log_map_size[slot]; i++) {
+ if (cl_alloc_log_map[slot][i]->ptr == ptr) {
+ break;
+ }
+ }
+
+ if (i == cl_alloc_log_map_size[slot]) {
+ printf("Free at file: %s, line: %d, We can not find the malloc log for this ptr:%p, fatal\n",
+ file, line, ptr);
+ assert(0);
+ }
+
+ free(cl_alloc_log_map[slot][i]);
+ cl_alloc_log_map[slot][i] = NULL;
+
+ pthread_mutex_unlock(&cl_alloc_log_lock);
+}
+
+LOCAL void* cl_malloc(size_t sz, char* file, int line)
+{
+ void* p = malloc(sz);
assert(p);
+ insert_alloc_log_item(p, sz, file, line);
return p;
}
LOCAL void*
-cl_aligned_malloc(size_t sz, size_t align)
+cl_aligned_malloc(size_t sz, size_t align, char* file, int line)
{
void * p = NULL;
- atomic_inc(&cl_alloc_n);
p = memalign(align, sz);
assert(p);
+ insert_alloc_log_item(p, ((sz + align - 1)/align)*align, file, line);
return p;
}
LOCAL void*
-cl_calloc(size_t n, size_t elem_size)
+cl_calloc(size_t n, size_t elem_size, char* file, int line)
{
void *p = NULL;
- atomic_inc(&cl_alloc_n);
p = calloc(n, elem_size);
assert(p);
+ insert_alloc_log_item(p, n*elem_size, file, line);
return p;
}
LOCAL void*
-cl_realloc(void *ptr, size_t sz)
+cl_realloc(void *ptr, size_t sz, char* file, int line)
{
- if (ptr == NULL)
- atomic_inc(&cl_alloc_n);
- return realloc(ptr, sz);
+ void *p = NULL;
+
+ if (ptr != NULL) {
+ delete_alloc_log_item(ptr, file, line);
+ }
+
+ p = realloc(ptr, sz);
+ assert(p);
+ insert_alloc_log_item(p, sz, file, line);
+ return p;
}
LOCAL void
-cl_free(void *ptr)
+cl_free(void *ptr, char* file, int line)
{
if (ptr == NULL)
return;
- atomic_dec(&cl_alloc_n);
- free(ptr);
- ptr = NULL;
-}
-LOCAL size_t
-cl_report_unfreed(void)
-{
- return cl_alloc_n;
+ delete_alloc_log_item(ptr, file, line);
+ free(ptr);
}
LOCAL void
-cl_report_set_all_freed(void)
+cl_alloc_report_unfreed(void)
{
- cl_alloc_n = 0;
}
diff --git a/libclapi/cl_alloc.h b/libclapi/cl_alloc.h
index cf938d66..1121c44f 100644
--- a/libclapi/cl_alloc.h
+++ b/libclapi/cl_alloc.h
@@ -23,23 +23,28 @@
#include <stdlib.h>
/* Return a valid pointer for the requested memory block size */
-extern void* cl_malloc(size_t sz);
+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);
+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);
+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);
+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);
+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 size_t cl_report_unfreed(void);
+extern void cl_alloc_report_unfreed(void);
#endif /* __CL_ALLOC_H__ */
diff --git a/libclapi/cl_context.c b/libclapi/cl_context.c
index db808f27..5e0ea756 100644
--- a/libclapi/cl_context.c
+++ b/libclapi/cl_context.c
@@ -195,7 +195,7 @@ LOCAL void cl_release_context(cl_context ctx)
/* Add a check point here. */
barrier_events_list = cl_check_context_barrier_events(ctx, &barrier_events_num, &err);
- assert(err != CL_SUCCESS);
+ assert(err == CL_SUCCESS);
if (barrier_events_list) {
assert(barrier_events_num > 0);
cl_free(barrier_events_list);