diff options
author | Guangxiong Lin <[email protected]> | 2022-12-16 13:53:35 +0800 |
---|---|---|
committer | Guangxiong Lin <[email protected]> | 2022-12-16 13:53:35 +0800 |
commit | 7369505397cdfddf0883e2c24e1652df8bd488fe (patch) | |
tree | e961bd1bba0276e2c5f523bf12663b34983c9e51 /tpool.c | |
parent | 49839c88a98d3798f7b18c58f54f26f36cacff38 (diff) | |
download | tinyserver-7369505397cdfddf0883e2c24e1652df8bd488fe.tar.gz tinyserver-7369505397cdfddf0883e2c24e1652df8bd488fe.tar.bz2 tinyserver-7369505397cdfddf0883e2c24e1652df8bd488fe.zip |
Refactor file structure
Diffstat (limited to 'tpool.c')
-rw-r--r-- | tpool.c | 186 |
1 files changed, 0 insertions, 186 deletions
diff --git a/tpool.c b/tpool.c deleted file mode 100644 index 1aa5986..0000000 --- a/tpool.c +++ /dev/null @@ -1,186 +0,0 @@ -#include <pthread.h> -#include <stdlib.h> -#include "tpool.h" - -struct tpool_work { - thread_func_t func; - void *arg; - struct tpool_work *next; -}; -typedef struct tpool_work tpool_work_t; - -tpool_t *tpool; - -static tpool_work_t *tpool_work_create(thread_func_t func, void *arg) -{ - tpool_work_t *work; - - if (func == NULL) - return NULL; - - work = (tpool_work_t *)malloc(sizeof(*work)); - work->func = func; - work->arg = arg; - work->next = NULL; - return work; -} - -static void tpool_work_destroy(tpool_work_t *work) -{ - if (work == NULL) - return; - - free(work); -} - -struct tpool { - tpool_work_t *work_first; - tpool_work_t *work_last; - pthread_mutex_t work_mutex; - pthread_cond_t work_cond; - pthread_cond_t working_cond; - size_t working_cnt; - size_t thread_cnt; - bool stop; -}; - -static tpool_work_t *tpool_pop(tpool_t *tp) -{ - if (tp == NULL) - return NULL; - - tpool_work_t *work = tp->work_first; - if (work == NULL) - return NULL; - - tp->work_first = work->next; - if (work == tp->work_last) - tp->work_last = NULL; - - return work; -} - -static void *tpool_worker(void *arg) -{ - tpool_t *tp = (tpool_t *)arg; - tpool_work_t *work; - - for (;;) { - pthread_mutex_lock(&tp->work_mutex); - - while (tp->work_first == NULL && !tp->stop) - pthread_cond_wait(&tp->work_cond, &tp->work_mutex); - - if (tp->stop) - break; - - work = tpool_pop(tp); - tp->working_cnt++; - pthread_mutex_unlock(&tp->work_mutex); - - if (work != NULL) { - work->func(work->arg); - tpool_work_destroy(work); - } - - pthread_mutex_lock(&tp->work_mutex); - tp->working_cnt--; - if (!tp->stop && tp->working_cnt == 0 && tp->work_first == NULL) - pthread_cond_signal(&tp->working_cond); - pthread_mutex_unlock(&tp->work_mutex); - } - - tp->thread_cnt--; - pthread_cond_signal(&tp->working_cond); - pthread_mutex_unlock(&tp->work_mutex); - - return NULL; -} - -tpool_t *tpool_create(size_t num) -{ - tpool_t *tp; - pthread_t thread; - - if (num == 0) - num = 12; - - tp = (tpool_t *)malloc(sizeof(*tp)); - tp->thread_cnt = num; - tp->work_first = tp->work_last = NULL; - - pthread_mutex_init(&tp->work_mutex, NULL); - pthread_cond_init(&tp->work_cond, NULL); - pthread_cond_init(&tp->working_cond, NULL); - - for (int i = 0; i < num; i++) { - pthread_create(&thread, NULL, tpool_worker, tp); - pthread_detach(thread); - } - - return tp; -} - -void tpool_destroy(tpool_t *tp) -{ - tpool_work_t *work, *next_work; - - if (tp == NULL) - return; - - pthread_mutex_lock(&tp->work_mutex); - work = tp->work_first; - while (work != NULL) { - next_work = work->next; - tpool_work_destroy(work); - work = next_work; - } - tp->stop = true; - - pthread_cond_broadcast(&tp->work_cond); - pthread_mutex_unlock(&tp->work_mutex); - - tpool_wait(tp); - - pthread_mutex_destroy(&tp->work_mutex); - pthread_cond_destroy(&tp->work_cond); - pthread_cond_destroy(&tp->working_cond); - - free(tp); -} - -bool tpool_add_work(tpool_t *tp, thread_func_t func, void *arg) -{ - tpool_work_t *work; - - if (tp == NULL) - return false; - - work = tpool_work_create(func, arg); - if (work == NULL) - return false; - - pthread_mutex_lock(&tp->work_mutex); - if (!tp->work_first) - tp->work_first = tp->work_last = work; - else - tp->work_last = tp->work_last->next = work; - - pthread_cond_broadcast(&tp->work_cond); - pthread_mutex_unlock(&tp->work_mutex); - - return true; -} - -void tpool_wait(tpool_t *tp) -{ - if (tp == NULL) - return; - - pthread_mutex_lock(&tp->work_mutex); - - while ((!tp->stop && tp->working_cnt != 0) || (tp->stop && tp->thread_cnt != 0)) - pthread_cond_wait(&tp->working_cond, &tp->work_mutex); - - pthread_mutex_unlock(&tp->work_mutex); -} |