aboutsummaryrefslogtreecommitdiff
path: root/core/sync
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-04-01 15:08:58 +0100
committergingerBill <bill@gingerbill.org>2022-04-01 15:08:58 +0100
commit2bc89260f13fee39427057e576a0789d55fd4504 (patch)
treea24771560bfc059b8d688bf6048dff038c7c1c58 /core/sync
parentc78b83f142a44f055bad80d7506d58c3ced59810 (diff)
Add explicit memory ordering for the internal Sema implementation
Diffstat (limited to 'core/sync')
-rw-r--r--core/sync/sema_internal.odin10
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
}
}