diff --git a/core/sync/sync2/primitives_atomic.odin b/core/sync/sync2/primitives_atomic.odin index bf47e6190..d65403076 100644 --- a/core/sync/sync2/primitives_atomic.odin +++ b/core/sync/sync2/primitives_atomic.odin @@ -2,7 +2,7 @@ //+private package sync2 -when !#config(ODIN_SYNC_USE_PTHREADS, false) { +when !#config(ODIN_SYNC_USE_PTHREADS, true) { import "core:time" diff --git a/core/sync/sync2/primitives_pthreads.odin b/core/sync/sync2/primitives_pthreads.odin index c0cab91e4..e85cff7fc 100644 --- a/core/sync/sync2/primitives_pthreads.odin +++ b/core/sync/sync2/primitives_pthreads.odin @@ -2,7 +2,7 @@ //+private package sync2 -when #config(ODIN_SYNC_USE_PTHREADS, false) { +when #config(ODIN_SYNC_USE_PTHREADS, true) { import "core:time" import "core:sys/unix" diff --git a/core/thread/thread.odin b/core/thread/thread.odin index fce35b124..09d23fe82 100644 --- a/core/thread/thread.odin +++ b/core/thread/thread.odin @@ -1,7 +1,6 @@ package thread import "core:runtime" -import "core:sync" import "core:mem" import "intrinsics" diff --git a/core/thread/thread_pool.odin b/core/thread/thread_pool.odin index 64cd8ea38..700eaf703 100644 --- a/core/thread/thread_pool.odin +++ b/core/thread/thread_pool.odin @@ -1,7 +1,7 @@ package thread import "intrinsics" -import "core:sync" +import sync "core:sync/sync2" import "core:mem" Task_Status :: enum i32 { @@ -26,7 +26,7 @@ INVALID_TASK_ID :: Task_Id(-1); Pool :: struct { allocator: mem.Allocator, mutex: sync.Mutex, - sem_available: sync.Semaphore, + sem_available: sync.Sema, processing_task_count: int, // atomic is_running: bool, @@ -40,14 +40,14 @@ pool_init :: proc(pool: ^Pool, thread_count: int, allocator := context.allocator pool := (^Pool)(t.data); for pool.is_running { - sync.semaphore_wait_for(&pool.sem_available); + sync.sema_wait(&pool.sem_available); if task, ok := pool_try_and_pop_task(pool); ok { pool_do_work(pool, &task); } } - sync.semaphore_post(&pool.sem_available, 1); + sync.sema_post(&pool.sem_available); } @@ -56,8 +56,6 @@ pool_init :: proc(pool: ^Pool, thread_count: int, allocator := context.allocator pool.tasks = make([dynamic]Task); pool.threads = make([]^Thread, thread_count); - sync.mutex_init(&pool.mutex); - sync.semaphore_init(&pool.sem_available); pool.is_running = true; for _, i in pool.threads { @@ -76,9 +74,6 @@ pool_destroy :: proc(pool: ^Pool) { } delete(pool.threads, pool.allocator); - - sync.mutex_destroy(&pool.mutex); - sync.semaphore_destroy(&pool.sem_available); } pool_start :: proc(pool: ^Pool) { @@ -90,7 +85,7 @@ pool_start :: proc(pool: ^Pool) { pool_join :: proc(pool: ^Pool) { pool.is_running = false; - sync.semaphore_post(&pool.sem_available, len(pool.threads)); + sync.sema_post(&pool.sem_available, len(pool.threads)); yield(); @@ -109,7 +104,7 @@ pool_add_task :: proc(pool: ^Pool, procedure: Task_Proc, data: rawptr, user_inde task.user_index = user_index; append(&pool.tasks, task); - sync.semaphore_post(&pool.sem_available, 1); + sync.sema_post(&pool.sem_available); } pool_try_and_pop_task :: proc(pool: ^Pool) -> (task: Task, got_task: bool = false) { @@ -140,7 +135,7 @@ pool_wait_and_process :: proc(pool: ^Pool) { // Safety kick if len(pool.tasks) != 0 && intrinsics.atomic_load(&pool.processing_task_count) == 0 { sync.mutex_lock(&pool.mutex); - sync.semaphore_post(&pool.sem_available, len(pool.tasks)); + sync.sema_post(&pool.sem_available, len(pool.tasks)); sync.mutex_unlock(&pool.mutex); } diff --git a/core/thread/thread_windows.odin b/core/thread/thread_windows.odin index b44ec8f36..b8f8d15c0 100644 --- a/core/thread/thread_windows.odin +++ b/core/thread/thread_windows.odin @@ -3,7 +3,7 @@ package thread import "core:runtime" -import "core:sync" +import sync "core:sync/sync2" import win32 "core:sys/windows" Thread_Os_Specific :: struct { @@ -38,7 +38,7 @@ _create :: proc(procedure: Thread_Proc, priority := Thread_Priority.Normal) -> ^ } } - sync.atomic_store(&t.done, true, .Sequentially_Consistent); + sync.atomic_store(&t.done, true); return 0; } @@ -73,7 +73,7 @@ _is_done :: proc(using thread: ^Thread) -> bool { // NOTE(tetra, 2019-10-31): Apparently using wait_for_single_object and // checking if it didn't time out immediately, is not good enough, // so we do it this way instead. - return sync.atomic_load(&done, .Sequentially_Consistent); + return sync.atomic_load(&done); } _join :: proc(using thread: ^Thread) {