diff options
| author | gingerBill <bill@gingerbill.org> | 2022-04-01 15:08:58 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-04-01 15:08:58 +0100 |
| commit | 2bc89260f13fee39427057e576a0789d55fd4504 (patch) | |
| tree | a24771560bfc059b8d688bf6048dff038c7c1c58 /core/sync | |
| parent | c78b83f142a44f055bad80d7506d58c3ced59810 (diff) | |
Add explicit memory ordering for the internal Sema implementation
Diffstat (limited to 'core/sync')
| -rw-r--r-- | core/sync/sema_internal.odin | 10 |
1 files changed, 5 insertions, 5 deletions
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 } } |