From a1a769239b2c5ec973892d41b3b4fbca10264d72 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Fri, 3 Feb 2023 16:53:30 +0800 Subject: [PATCH] feat: free pool memory after join process --- main.c | 10 ++++++++-- tiny_pool.c | 30 +++++++++++++++++++----------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/main.c b/main.c index 94c022a..01485b1 100644 --- a/main.c +++ b/main.c @@ -14,9 +14,10 @@ void demo_fun(void *i) { int main() { - pool_t *pool = tiny_pool_create(2); +// pool_t *pool = tiny_pool_create(2); + pool_t *pool = tiny_pool_create(4); - int dat[] = {1, 2, 3, 4, 5, 6, 7, 8}; + int dat[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; tiny_pool_submit(pool, demo_fun, (void*)&dat[0]); tiny_pool_submit(pool, demo_fun, (void*)&dat[1]); @@ -31,11 +32,16 @@ int main() { tiny_pool_submit(pool, demo_fun, (void*)&dat[2]); tiny_pool_submit(pool, demo_fun, (void*)&dat[3]); tiny_pool_submit(pool, demo_fun, (void*)&dat[4]); + tiny_pool_submit(pool, demo_fun, (void*)&dat[5]); + tiny_pool_submit(pool, demo_fun, (void*)&dat[6]); printf("+ main: sleep 8s\n"); sleep(6); printf("+ main: wake up\n"); + tiny_pool_submit(pool, demo_fun, (void*)&dat[7]); + tiny_pool_submit(pool, demo_fun, (void*)&dat[8]); + printf("+ main: pool joining\n"); tiny_pool_join(pool); printf("+ main: pool join complete\n"); diff --git a/tiny_pool.c b/tiny_pool.c index cb70e41..41c3dce 100644 --- a/tiny_pool.c +++ b/tiny_pool.c @@ -56,7 +56,7 @@ pool_t* tiny_pool_create(uint32_t size) { } void task_queue_push(pool_t *pool, task_t *task) { - printf("push new task\n"); + printf("push new task %d\n", *(int*)task->arg); if (pool->task_queue_rear == NULL) { // task queue is empty pool->task_queue_front = task; pool->task_queue_rear = task; // init task queue with one element @@ -69,12 +69,12 @@ void task_queue_push(pool_t *pool, task_t *task) { } task_t* task_queue_pop(pool_t *pool) { // pop one task with blocking wait - printf("%lu -> pop one task\n", pthread_self()); + printf("%lu -> start pop task\n", pthread_self()); /// wait until task queue not empty pthread_mutex_lock(&pool->mutex); // lock pool struct while (pool->task_queue_front == NULL) { // loop until task queue not empty - printf("%lu -> pop start wait\n", pthread_self()); + printf("%lu -> pop wait\n", pthread_self()); pthread_cond_wait(&pool->task_queue_not_empty, &pool->mutex); // wait new task added printf("%lu -> pop exit wait\n", pthread_self()); if (pool->status == EXITING) { @@ -82,7 +82,7 @@ task_t* task_queue_pop(pool_t *pool) { // pop one task with blocking wait pthread_exit(NULL); // sub thread exit at EXITING stage } } - printf("%lu -> pop new task\n", pthread_self()); + printf("%lu -> pop new task %d\n", pthread_self(), *(int*)pool->task_queue_front->arg); /// pop first task from queue bool empty_flag = false; @@ -99,6 +99,7 @@ task_t* task_queue_pop(pool_t *pool) { // pop one task with blocking wait /// send signal to active blocking thread if (empty_flag) { // send signal after mutex unlocked + printf("signal -> task queue empty\n"); pthread_cond_signal(&pool->task_queue_empty); // active pool join thread } return front; // success pop one task @@ -208,7 +209,6 @@ bool tiny_pool_join(pool_t *pool) { } printf("task queue empty\n"); - pool->status = EXITING; printf("pool status -> EXITING\n"); @@ -220,12 +220,6 @@ bool tiny_pool_join(pool_t *pool) { pthread_mutex_unlock(&pool->mutex); // prevent other functions blocking waiting - - printf("unlock mutex and send broadcast\n"); -// pthread_cond_broadcast(&pool->task_queue_not_empty); // send broadcast to trigger idle threads - - // TODO: signal broadcast and wait all thread exit - printf("start sub threads joining\n"); for (uint32_t i = 0; i < pool->thread_num; ++i) { pthread_cond_broadcast(&pool->task_queue_not_empty); // trigger idle threads @@ -234,5 +228,19 @@ bool tiny_pool_join(pool_t *pool) { } printf("sub threads join complete\n"); + // TODO: free resource + + printf("start free pool resource\n"); + + pthread_cond_destroy(&pool->without_busy_thread); + pthread_cond_destroy(&pool->task_queue_not_empty); + pthread_cond_destroy(&pool->task_queue_empty); + pthread_mutex_destroy(&pool->mutex); + + free(pool->threads); + free(pool); + + printf("free pool resource complete\n"); + return true; }