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.
This commit is contained in:
Tetralux
2020-04-21 16:08:16 +00:00
parent 2c91c21021
commit 3afa2736b7

View File

@@ -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();
}
}