void acl_mem_slice_set(ACL_MEM_SLICE *mem_slice) { const char *myname = "acl_mem_slice_set"; if (__mem_slice_key != (acl_pthread_key_t) -1) { return; } __mem_slice_key = mem_slice->tls_key; __mem_base = mem_slice->slice_pool->base; __mem_nslice = mem_slice->slice_pool->nslice; __mem_nalloc_gc = mem_slice->nalloc_gc; __mem_slice_flag = mem_slice->slice_flag; __mem_slice_list = mem_slice->slice_list; __mem_slice_list_lock = mem_slice->slice_list_lock; __mem_list_init_size = __mem_nalloc_gc / 10; if (__mem_list_init_size < 1000) __mem_list_init_size = 1000; else if (__mem_list_init_size > 1000000) __mem_list_init_size = 1000000; acl_mem_hook(tls_mem_alloc, tls_mem_calloc, tls_mem_realloc, tls_mem_strdup, tls_mem_strndup, tls_mem_memdup, tls_mem_free); acl_msg_info("%s(%d): set ACL_MEM_SLICE, with tls", myname, __LINE__); }
static void mempool_close(void) { acl_mem_hook(acl_default_malloc, acl_default_calloc, acl_default_realloc, acl_default_strdup, acl_default_strndup, acl_default_memdup, acl_default_free); }
static void mempool_init_no_mutex(void) { acl_mem_hook(mempool_malloc, mempool_calloc, mempool_realloc, mempool_strdup, mempool_strndup, mempool_memdup, mempool_free); }
ACL_MEM_SLICE *acl_mem_slice_init(int base, int nslice, int nalloc_gc, unsigned int slice_flag) { const char *myname = "acl_mem_slice_init"; ACL_MEM_SLICE *mem_slice; if (__mem_slice_key != (acl_pthread_key_t) -1) { acl_msg_error("%s(%d): has been init", myname, __LINE__); return NULL; } __mem_base = base; __mem_nslice = nslice; __mem_nalloc_gc = nalloc_gc < 10 ? 10 : nalloc_gc; __mem_slice_flag = slice_flag; __mem_list_init_size = nalloc_gc / 10; if (__mem_list_init_size < 1000) __mem_list_init_size = 1000; else if (__mem_list_init_size > 1000000) __mem_list_init_size = 1000000; /* 主线程获得自己的线程局部存储内存池 */ mem_slice = mem_slice_create(); if (mem_slice == NULL) acl_msg_fatal("%s(%d): mem_slice null", myname, __LINE__); /* 创建进程空间内全局的内存池集合对象, 其存储所有线程的存储内存池句柄 */ __mem_slice_list = private_array_create(10); __mem_slice_list_lock = thread_mutex_create(); private_array_push(__mem_slice_list, mem_slice); mem_slice->slice_list = __mem_slice_list; mem_slice->slice_list_lock = __mem_slice_list_lock; if (__mem_slice_list == NULL) acl_msg_fatal("%s(%d): __mem_slice_list null", myname, __LINE__); if (__mem_slice_list_lock == NULL) acl_msg_fatal("%s(%d): __mem_slice_list_lock null", myname, __LINE__); atexit(free_global_ctx); mem_slice->tls_key = __mem_slice_key; acl_mem_hook(tls_mem_alloc, tls_mem_calloc, tls_mem_realloc, tls_mem_strdup, tls_mem_strndup, tls_mem_memdup, tls_mem_free); acl_msg_info("%s(%d): use ACL_MEM_SLICE, with tls", myname, __LINE__); return mem_slice; }
static void mempool_init_with_mutex(void) { if (__use_lock == 0) { MUTEX_INIT; __use_lock = 1; } acl_mem_hook(mempool_malloc_with_mutex, mempool_calloc_with_mutex, mempool_realloc_with_mutex, mempool_strdup_with_mutex, mempool_strndup_with_mutex, mempool_memdup_with_mutex, mempool_free_with_mutex); }