From 0ab356aa4e5dc8e16ee4c0ac008e19455ac3b906 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 22 Jun 2020 13:32:58 +0100 Subject: [PATCH] Fix sync and thread on *nix --- core/sync/sync_unix.odin | 2 +- core/thread/thread_unix.odin | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/sync/sync_unix.odin b/core/sync/sync_unix.odin index 4e7e57bd4..6b0c9b5f8 100644 --- a/core/sync/sync_unix.odin +++ b/core/sync/sync_unix.odin @@ -81,7 +81,7 @@ condition_signal :: proc(c: ^Condition) -> bool { // Awaken all threads who are waiting on the condition condition_broadcast :: proc(c: ^Condition) -> bool { - return pthread_cond_broadcast(&c.handle) == 0; + return unix.pthread_cond_broadcast(&c.handle) == 0; } // Wait for the condition to be signalled. diff --git a/core/thread/thread_unix.odin b/core/thread/thread_unix.odin index 42e372956..8d8476043 100644 --- a/core/thread/thread_unix.odin +++ b/core/thread/thread_unix.odin @@ -20,6 +20,7 @@ Thread_Os_Specific :: struct #align 16 { // signal to start it. // destroyed after thread is started. start_gate: sync.Condition, + start_mutex: sync.Mutex, // if true, the thread has been started and the start_gate has been destroyed. started: bool, @@ -48,7 +49,9 @@ create :: proc(procedure: Thread_Proc, priority := Thread_Priority.Normal) -> ^T t := (^Thread)(t); sync.condition_wait_for(&t.start_gate); sync.condition_destroy(&t.start_gate); + sync.mutex_destroy(&t.start_mutex); t.start_gate = {}; + t.start_mutex = {}; c := context; if ic, ok := t.init_context.?; ok { @@ -96,7 +99,8 @@ create :: proc(procedure: Thread_Proc, priority := Thread_Priority.Normal) -> ^T res = unix.pthread_attr_setschedparam(&attrs, ¶ms); assert(res == 0); - sync.condition_init(&thread.start_gate); + sync.mutex_init(&thread.start_mutex); + sync.condition_init(&thread.start_gate, &thread.start_mutex); if unix.pthread_create(&thread.unix_thread, &attrs, __linux_thread_entry_proc, thread) != 0 { free(thread); return nil;