|
@@ -36,6 +36,10 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread {
|
|
sync.wait(&t.cond, &t.mutex)
|
|
sync.wait(&t.cond, &t.mutex)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if .Joined in t.flags {
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
|
|
+
|
|
when ODIN_OS != .Darwin {
|
|
when ODIN_OS != .Darwin {
|
|
// Enable thread's cancelability.
|
|
// Enable thread's cancelability.
|
|
if can_set_thread_cancel_state {
|
|
if can_set_thread_cancel_state {
|
|
@@ -143,6 +147,11 @@ _join :: proc(t: ^Thread) {
|
|
if res, ok := CAS(&t.flags, unjoined, joined); res == joined && !ok {
|
|
if res, ok := CAS(&t.flags, unjoined, joined); res == joined && !ok {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
+ // Prevent non-started threads from blocking main thread with initial wait
|
|
|
|
+ // condition.
|
|
|
|
+ if .Started not_in unjoined {
|
|
|
|
+ _start(t)
|
|
|
|
+ }
|
|
unix.pthread_join(t.unix_thread, nil)
|
|
unix.pthread_join(t.unix_thread, nil)
|
|
}
|
|
}
|
|
|
|
|