mirror of
https://github.com/odin-lang/Odin.git
synced 2026-02-16 08:04:07 +00:00
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:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user