Beispiel #1
0
static void fifo_test(bool use_slice)
{
	ACL_FIFO *fifo;
	int   i;
	char *ptr;
	ACL_SLICE_POOL *slice;

	if (use_slice)
		slice = acl_slice_pool_create(10, 100,
			ACL_SLICE_FLAG_GC2 | ACL_SLICE_FLAG_RTGC_OFF);
	else
		slice = NULL;

	fifo = acl_fifo_new1(slice);

	for (i = 0; i < 20; i++) {
		if (slice)
			ptr = (char*) acl_slice_pool_alloc(__FILE__, __LINE__,
					slice, 100);
		else
			ptr = (char*) acl_mymalloc(100);
		snprintf(ptr, 100, "test:%d", i);
		(void) acl_fifo_push(fifo, ptr);
		printf(">>>ptr: %s\n", ptr);
	}

	while (1) {
		ptr = (char*) acl_fifo_pop(fifo);
		if (ptr == NULL)
			break;
		printf("fifo pop: %s\n", ptr);
	}

	if (slice == NULL)
		acl_fifo_free(fifo, acl_myfree_fn);
	else
		acl_slice_pool_destroy(slice);
}
Beispiel #2
0
static void tls_mem_free(const char *filename, int line, void *ptr)
{
	MBLOCK *real_ptr;
	size_t len;

	CHECK_IN_PTR2(ptr, real_ptr, len, filename, line);

#if 1
	if (real_ptr->mem_slice->tid != (unsigned long) acl_pthread_self()) {
#else
	if (real_ptr->mem_slice->tid != mem_slice->tid) {
#endif
		MUTEX_LOCK(real_ptr->mem_slice);
		PRIVATE_ARRAY_PUSH(real_ptr->mem_slice->list, real_ptr);
		MUTEX_UNLOCK(real_ptr->mem_slice);
	} else
		acl_slice_pool_free(filename, line, real_ptr);
}

static void *tls_mem_alloc(const char *filename, int line, size_t len)
{
	const char *myname = "tls_mem_alloc";
	ACL_MEM_SLICE *mem_slice = acl_pthread_getspecific(__mem_slice_key);
	char *ptr;
	MBLOCK *real_ptr;

	if (mem_slice == NULL) {
		/* 每个子线程获得自己的线程局部存储内存池 */
		mem_slice = mem_slice_create();
		mem_slice->slice_list = __mem_slice_list;

		/* 将子线程的线程局部存储内存池置入全局内存池句柄集合中 */
		if (__mem_slice_list_lock)
			thread_mutex_lock(__mem_slice_list_lock);
		private_array_push(__mem_slice_list, mem_slice);
		if (__mem_slice_list_lock)
			thread_mutex_unlock(__mem_slice_list_lock);
	}

	real_ptr = (MBLOCK *) acl_slice_pool_alloc(filename, line,
			mem_slice->slice_pool, SPACE_FOR(len));
	if (real_ptr == 0) {
		acl_msg_error("%s(%d): malloc: insufficient memory",
			myname, __LINE__);
		return 0;
	}

	mem_slice->nalloc++;
	if (mem_slice->nalloc == mem_slice->nalloc_gc) {
		mem_slice->nalloc = 0;
		mem_slice_gc(mem_slice);
	}
	CHECK_OUT_PTR(ptr, real_ptr, mem_slice, len);
	return ptr;
}

static void *tls_mem_calloc(const char *filename, int line, size_t nmemb, size_t size)
{
	void *ptr = tls_mem_alloc(filename, line, nmemb * size);

	memset(ptr, 0, nmemb * size);
	return ptr;
}