aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2019-09-03 21:17:46 +0100
committergingerBill <bill@gingerbill.org>2019-09-03 21:17:46 +0100
commitc92b2e961297b3bf0c37070c27bcba34e27a2b9b (patch)
tree14533e4975a2c0668c475c8a0f0f849ebf8f75c0 /src
parent1af143b7499fc035578a655ee4ca65ff164d9f04 (diff)
Fix semaphore posting
Diffstat (limited to 'src')
-rw-r--r--src/thread_pool.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/thread_pool.cpp b/src/thread_pool.cpp
index bbe9ccac6..8a32b7aca 100644
--- a/src/thread_pool.cpp
+++ b/src/thread_pool.cpp
@@ -124,15 +124,14 @@ void thread_pool_add_task(ThreadPool *pool, WorkerTaskProc *proc, void *data) {
pool->tasks[pool->task_count++] = task;
- gb_mutex_unlock(&pool->task_mutex);
-
gb_semaphore_post(&pool->semaphore, 1);
+ gb_mutex_unlock(&pool->task_mutex);
}
void thread_pool_kick(ThreadPool *pool) {
gb_mutex_lock(&pool->task_mutex);
if (pool->task_count > 0) {
- isize count = gb_max(pool->task_count, pool->thread_count);
+ isize count = gb_min(pool->task_count, pool->thread_count);
for (isize i = 0; i < count; i++) {
gb_semaphore_post(&pool->semaphore, 1);
}
@@ -144,6 +143,14 @@ void thread_pool_kick_and_wait(ThreadPool *pool) {
isize return_value = 0;
while (pool->task_count > 0 || gb_atomic32_load(&pool->processing_work_count) != 0) {
+
+ if (pool->task_count > 0 && gb_atomic32_load(&pool->processing_work_count) == 0) {
+ gb_mutex_lock(&pool->task_mutex);
+ for (isize i = 0; i < pool->task_count; i++) {
+ gb_semaphore_post(&pool->semaphore, 1);
+ }
+ gb_mutex_unlock(&pool->task_mutex);
+ }
gb_yield();
}