From 561b725b0ec4b2be9180c1b8e2ee9fdf0d6fab34 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 30 Mar 2022 16:15:48 +0100 Subject: [PATCH] Improve spin lock for atomic_mutex_lock --- core/sync/sync2/primitives_atomic.odin | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/sync/sync2/primitives_atomic.odin b/core/sync/sync2/primitives_atomic.odin index 5fc6fba85..dd082029b 100644 --- a/core/sync/sync2/primitives_atomic.odin +++ b/core/sync/sync2/primitives_atomic.odin @@ -38,6 +38,9 @@ atomic_mutex_lock :: proc(m: ^Atomic_Mutex) { } } + // Set just in case 100 iterations did not do it + new_state = .Waiting + for { if atomic_exchange_acquire(&m.state, .Waiting) == .Unlocked { return @@ -49,11 +52,7 @@ atomic_mutex_lock :: proc(m: ^Atomic_Mutex) { } - switch v := atomic_exchange_acquire(&m.state, .Locked); v { - case .Unlocked: - // Okay - case: fallthrough - case .Locked, .Waiting: + if v := atomic_exchange_acquire(&m.state, .Locked); v != .Unlocked { lock_slow(m, v) } }