Browse Source

Add explicit memory ordering for the internal Sema implementation

gingerBill 3 years ago
parent
commit
2bc89260f1
1 changed files with 5 additions and 5 deletions
  1. 5 5
      core/sync/sema_internal.odin

+ 5 - 5
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
 			}
 		}