Browse Source

Fix deadlock in `Auto_Reset_Event`

Feoramund 11 months ago
parent
commit
a1435a6a90
1 changed files with 4 additions and 5 deletions
  1. 4 5
      core/sync/extended.odin

+ 4 - 5
core/sync/extended.odin

@@ -228,15 +228,14 @@ thread.
 */
 auto_reset_event_signal :: proc "contextless" (e: ^Auto_Reset_Event) {
 	old_status := atomic_load_explicit(&e.status, .Relaxed)
+	new_status := old_status + 1 if old_status < 1 else 1
 	for {
-		new_status := old_status + 1 if old_status < 1 else 1
 		if _, ok := atomic_compare_exchange_weak_explicit(&e.status, old_status, new_status, .Release, .Relaxed); ok {
 			break
 		}
-
-		if old_status < 0 {
-			sema_post(&e.sema)
-		}
+	}
+	if old_status < 0 {
+		sema_post(&e.sema)
 	}
 }