2014-11-19 00:25:21 +08:00
|
|
|
#include "gc.h"
|
|
|
|
#include "lib_acl.h"
|
|
|
|
#include "mem_gc.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
#define GC_LINUX_THREADS
|
|
|
|
#define GC_DEBUG
|
|
|
|
*/
|
|
|
|
|
|
|
|
static void *malloc_hook(const char *fname acl_unused, int line acl_unused, size_t size)
|
|
|
|
{
|
|
|
|
return (GC_MALLOC(size));
|
|
|
|
/*
|
|
|
|
return (GC_MALLOC_ATOMIC(size));
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *calloc_hook(const char *fname, int line, size_t nmemb, size_t size)
|
|
|
|
{
|
|
|
|
void *ptr = malloc_hook(fname, line, nmemb * size);
|
|
|
|
|
|
|
|
memset(ptr, 0, nmemb * size);
|
|
|
|
return (ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *realloc_hook(const char *fname acl_unused, int line acl_unused, void *ptr, size_t size)
|
|
|
|
{
|
|
|
|
return (GC_REALLOC(ptr, size));
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *strdup_hook(const char *fname acl_unused, int line acl_unused, const char *ptr)
|
|
|
|
{
|
|
|
|
return (GC_STRDUP(ptr));
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *strndup_hook(const char *fname, int line, const char *s, size_t len)
|
|
|
|
{
|
|
|
|
size_t n = strlen(s);
|
|
|
|
char *ptr;
|
|
|
|
|
|
|
|
n = n > len ? len : n;
|
|
|
|
ptr = (char*) malloc_hook(fname, line, len);
|
|
|
|
memcpy(ptr, s, n);
|
|
|
|
ptr[n] = 0;
|
|
|
|
return (ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *memdup_hook(const char *fname, int line, const void *p, size_t size)
|
|
|
|
{
|
|
|
|
void *ptr;
|
|
|
|
|
|
|
|
ptr = malloc_hook(fname, line, size);
|
|
|
|
memcpy(ptr, p, size);
|
|
|
|
return (ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void free_hook(const char *fname acl_unused, int line acl_unused, void *ptr)
|
|
|
|
{
|
|
|
|
GC_FREE(ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
void mem_gc_hook()
|
|
|
|
{
|
|
|
|
GC_INIT();
|
|
|
|
acl_mem_hook(malloc_hook, calloc_hook, realloc_hook,
|
|
|
|
strdup_hook, strndup_hook, memdup_hook, free_hook);
|
|
|
|
}
|
|
|
|
|