static DWORD WINAPI RunThreadWrap(LPVOID data) #endif { acl_pthread_t *thread = (acl_pthread_t *) data; void *return_arg; ACL_FIFO *tls_value_list_ptr = tls_value_list_get(); unsigned long *tid = 0; /* 只是为了避免与主线程的 h_thread->handle = handle 产生冲突 */ if (__thread_inited) acl_pthread_mutex_lock(&__thread_lock); if (__thread_inited) acl_pthread_mutex_unlock(&__thread_lock); thread->id = acl_pthread_self(); return_arg = (void*) thread->start_routine(thread->routine_arg); /* 释放由 acl_pthread_setspecific 添加的线程局部变量 */ while (1) { TLS_VALUE *tls_value = private_fifo_pop(tls_value_list_ptr); if (tls_value == NULL) break; if (tls_value->tls_key == NULL || tls_value->tls_key->destructor == NULL || tls_value->tls_key->key < 0 || tls_value->tls_key->key >= ACL_PTHREAD_KEYS_MAX) { acl_default_free(__FILE__, __LINE__, tls_value); continue; } tls_value->tls_key->destructor(tls_value->value); acl_default_free(__FILE__, __LINE__, tls_value); } private_fifo_free(tls_value_list_ptr, NULL); /* 如果线程创建时为分离方式则需要关闭线程句柄 */ if (thread->detached) { if (!CloseHandle(thread->handle)) { acl_msg_error("close handle error(%s)", acl_last_serror()); } } acl_default_free(__FILE__, __LINE__, thread); return (DWORD) return_arg; }
void acl_mem_slice_delay_destroy(void) { const char *myname = "acl_mem_slice_delay_destroy"; int i, n; if (__mem_slice_list_lock == NULL) return; thread_mutex_lock(__mem_slice_list_lock); n = private_array_size(__mem_slice_list); for (i = 0; i < n; i++) { ACL_MEM_SLICE *mem_slice = (ACL_MEM_SLICE*) private_array_index(__mem_slice_list, i); if (mem_slice == NULL) break; if (mem_slice->delay_free == 0) continue; if (acl_slice_pool_used(mem_slice->slice_pool) <= 0) { acl_msg_info("%s(%d): thread(%ld) free mem slice now", myname, __LINE__, mem_slice->tid); acl_slice_pool_destroy(mem_slice->slice_pool); private_array_destroy(mem_slice->list, NULL); mem_slice->list = NULL; /* 将子线程的线程局部存储内存池从全局内存池句柄集合中删除 */ private_array_delete_obj(__mem_slice_list, mem_slice, NULL); acl_default_free(__FILE__, __LINE__, mem_slice); } else mem_slice_gc(mem_slice); } thread_mutex_unlock(__mem_slice_list_lock); }
static void slice3_mbuf_free(ACL_SLICE *slice, MBUF3 *mbuf) { SLICE3 *slice3 = (SLICE3*) slice; acl_assert(mbuf->ibuf + 1 == slice->nbuf); if (slice3->imbuf_avail == mbuf->ibuf) slice3->imbuf_avail--; if (slice3->imbuf_avail == -1) slice3->imbuf_avail = 0; acl_default_free(__FILE__, __LINE__, mbuf->mslots.slots); acl_default_free(__FILE__, __LINE__, mbuf); slice->nbuf--; slice->nfree++; slice->length -= slice->page_size + sizeof(void*) * slice->page_nslots; }
static void mem_slice_free(ACL_MEM_SLICE *mem_slice) { const char *myname = "mem_slice_free"; int n; if (mem_slice == NULL) { acl_msg_info("%s(%d): mem_slice null", myname, __LINE__); return; } /* 先回收本身线程的垃圾内存片 */ mem_slice_gc(mem_slice); if ((n = acl_slice_pool_used(mem_slice->slice_pool)) > 0) { acl_msg_info("%s(%d): thread(%ld) mem slice busy slices: %d, delay free it", myname, __LINE__, mem_slice->tid, n); if (__mem_slice_list_lock) thread_mutex_lock(__mem_slice_list_lock); mem_slice->delay_free = 1; if (__mem_slice_list_lock) thread_mutex_unlock(__mem_slice_list_lock); /* 尽量回收一些已经完全释放的内存 */ acl_slice_pool_gc(mem_slice->slice_pool); } else { acl_msg_info("%s(%d): thread(%ld) free mem slice now", myname, __LINE__, mem_slice->tid); acl_slice_pool_destroy(mem_slice->slice_pool); private_array_destroy(mem_slice->list, NULL); mem_slice->list = NULL; /* 将子线程的线程局部存储内存池从全局内存池句柄集合中删除 */ if (__mem_slice_list_lock) thread_mutex_lock(__mem_slice_list_lock); private_array_delete_obj(__mem_slice_list, mem_slice, NULL); if (__mem_slice_list_lock) thread_mutex_unlock(__mem_slice_list_lock); acl_default_free(__FILE__, __LINE__, mem_slice); } }
static void tls_value_list_on_free(void *ctx) { acl_default_free(__FILE__, __LINE__, ctx); }