From cfd21f8ca2c0a8135dea6bb8dbcf38ebbe0903b4 Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Fri, 2 Jun 2023 22:34:02 +0200 Subject: [PATCH] Windows thread pool. --- src/utils/taskqueue.c | 52 ++++++++++++++++++++++++++++++++++++++++++- src/version.h | 2 +- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/utils/taskqueue.c b/src/utils/taskqueue.c index e2e1ce75e..1100bedaa 100644 --- a/src/utils/taskqueue.c +++ b/src/utils/taskqueue.c @@ -51,8 +51,58 @@ void taskqueue_run(int threads, Task **task_list) pthread_mutex_destroy(&queue.lock); } -#else +#elif PLATFORM_WINDOWS +#include +#include + +typedef struct TaskQueue_ +{ + CRITICAL_SECTION lock; + Task **queue; +} TaskQueue; + +static DWORD WINAPI taskqueue_thread(LPVOID lpParam) +{ + TaskQueue *task_queue = (TaskQueue *)lpParam; + bool is_active = false; + while (1) + { + EnterCriticalSection(&task_queue->lock); + unsigned task_count = vec_size(task_queue->queue); + if (!task_count) goto SHUTDOWN; + Task *task = (Task*)task_queue->queue[task_count - 1]; + vec_pop(task_queue->queue); + LeaveCriticalSection(&task_queue->lock); + task->task(task->arg); + } +SHUTDOWN: + LeaveCriticalSection(&task_queue->lock); + return 0; +} + +void taskqueue_run(int threads, Task **task_list) +{ + assert(threads > 0); + HANDLE *handles = malloc(sizeof(HANDLE) * (unsigned)threads); + TaskQueue queue = { .queue = task_list }; + InitializeCriticalSection(&queue.lock); + for (int i = 0; i < threads; i++) + { + handles[i] = (HANDLE)_beginthreadex(NULL, 0, taskqueue_thread, &queue, 0, NULL); + if (handles[i] == NULL) error_exit("Fail to set up thread pool"); + } + WaitForMultipleObjects(threads, handles, TRUE, INFINITE); + + for (int i = 0; i < threads; i++) + { + CloseHandle(handles[i]); + } + free((void*)handles); + DeleteCriticalSection(&queue.lock); +} + +#else void taskqueue_run(int threads, Task **task_list) { diff --git a/src/version.h b/src/version.h index 8cce8d362..1f910107e 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define COMPILER_VERSION "0.4.521" \ No newline at end of file +#define COMPILER_VERSION "0.4.522" \ No newline at end of file