Browse Source

Fix `sync.Benaphore`

The calls to `atomic_add*` return the value before adding, not after, so
the previous code was causing the occasional data race.
Feoramund 11 months ago
parent
commit
9d6f71fd2e
1 changed files with 3 additions and 3 deletions
  1. 3 3
      core/sync/extended.odin

+ 3 - 3
core/sync/extended.odin

@@ -355,7 +355,7 @@ from entering any critical sections associated with the same benaphore, until
 until the lock is released.
 until the lock is released.
 */
 */
 benaphore_lock :: proc "contextless" (b: ^Benaphore) {
 benaphore_lock :: proc "contextless" (b: ^Benaphore) {
-	if atomic_add_explicit(&b.counter, 1, .Acquire) > 1 {
+	if atomic_add_explicit(&b.counter, 1, .Acquire) > 0 {
 		sema_wait(&b.sema)
 		sema_wait(&b.sema)
 	}
 	}
 }
 }
@@ -384,7 +384,7 @@ are waiting on the lock, exactly one thread is allowed into a critical section
 associated with the same banaphore.
 associated with the same banaphore.
 */
 */
 benaphore_unlock :: proc "contextless" (b: ^Benaphore) {
 benaphore_unlock :: proc "contextless" (b: ^Benaphore) {
-	if atomic_sub_explicit(&b.counter, 1, .Release) > 0 {
+	if atomic_sub_explicit(&b.counter, 1, .Release) > 1 {
 		sema_post(&b.sema)
 		sema_post(&b.sema)
 	}
 	}
 }
 }
@@ -740,4 +740,4 @@ Make event available.
 one_shot_event_signal :: proc "contextless" (e: ^One_Shot_Event) {
 one_shot_event_signal :: proc "contextless" (e: ^One_Shot_Event) {
 	atomic_store_explicit(&e.state, 1, .Release)
 	atomic_store_explicit(&e.state, 1, .Release)
 	futex_broadcast(&e.state)
 	futex_broadcast(&e.state)
-}
+}