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 committed 2020-04-21 17:04:29 +00:00
1 parent 2c91c21021
commit 3afa2736b7
1 file changed
+1 -1
+1 -1
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();
}
}