소스 검색

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.
Tetralux 5 년 전
부모
커밋
3afa2736b7
1개의 변경된 파일1개의 추가작업 그리고 1개의 파일을 삭제
  1. 1 1
      core/sync/sync.odin

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