diff --git a/core/sync/sema_internal.odin b/core/sync/sema_internal.odin index d265caa81..e4a3c0bfc 100644 --- a/core/sync/sema_internal.odin +++ b/core/sync/sema_internal.odin @@ -10,7 +10,7 @@ when #config(ODIN_SYNC_SEMA_USE_FUTEX, true) { } _sema_post :: proc(s: ^Sema, count := 1) { - atomic_add(&s.impl.count, Futex(count)) + atomic_add_explicit(&s.impl.count, Futex(count), .Release) if count == 1 { futex_signal(&s.impl.count) } else { @@ -20,12 +20,12 @@ when #config(ODIN_SYNC_SEMA_USE_FUTEX, true) { _sema_wait :: proc(s: ^Sema) { for { - original_count := atomic_load(&s.impl.count) + original_count := atomic_load_explicit(&s.impl.count, .Relaxed) for original_count == 0 { futex_wait(&s.impl.count, u32(original_count)) original_count = s.impl.count } - if original_count == atomic_compare_exchange_strong(&s.impl.count, original_count, original_count-1) { + if original_count == atomic_compare_exchange_strong_explicit(&s.impl.count, original_count, original_count-1, .Acquire, .Acquire) { return } } @@ -37,7 +37,7 @@ when #config(ODIN_SYNC_SEMA_USE_FUTEX, true) { } for { - original_count := atomic_load(&s.impl.count) + original_count := atomic_load_explicit(&s.impl.count, .Relaxed) for start := time.tick_now(); original_count == 0; /**/ { remaining := duration - time.tick_since(start) if remaining < 0 { @@ -49,7 +49,7 @@ when #config(ODIN_SYNC_SEMA_USE_FUTEX, true) { } original_count = s.impl.count } - if original_count == atomic_compare_exchange_strong(&s.impl.count, original_count, original_count-1) { + if original_count == atomic_compare_exchange_strong_explicit(&s.impl.count, original_count, original_count-1, .Acquire, .Acquire) { return true } }