From 3afa2736b7c8826527cb71ec3ca220750e0d2a9e Mon Sep 17 00:00:00 2001 From: Tetralux Date: Tue, 21 Apr 2020 16:08:16 +0000 Subject: [PATCH] Fix potential bad optimization bug in sync.Ticket_Mutex When locking, we were not loading m.serving atomically and so the optimizer could have hoisted the check out of the loop, thus resulting in an infinite loop. --- core/sync/sync.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sync/sync.odin b/core/sync/sync.odin index 5a0512275..c6aeddd5d 100644 --- a/core/sync/sync.odin +++ b/core/sync/sync.odin @@ -17,7 +17,7 @@ ticket_mutex_init :: proc(m: ^Ticket_Mutex) { ticket_mutex_lock :: inline proc(m: ^Ticket_Mutex) { ticket := atomic_add(&m.ticket, 1, .Relaxed); - for ticket != m.serving { + for ticket != atomic_load(&m.serving, .Acquire) { yield_processor(); } }