zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 1f78e34de08bb1fdaa93291334bd86a4c8b2825d (tree)
parent b6f99a59a3270baf6bfd8e3152e58f1c47455d08
Author: Justus Klausecker <justus@klausecker.de>
Date:   Sat, 21 Mar 2026 01:51:04 +0100

std.Io.Threaded: make `mutexLock()` use `cmpxchgStrong` instead of `cmpxchgWeak`

As established in 048e38624e and d70bd0b37e, mutexes should use a strong
cmpxchg when attempting to lock to guarantee that they actually succeed
if they aren't locked yet.

Also deletes an unused near-duplicate of `mutexLock()`.

Diffstat:
Mlib/std/Io/Threaded.zig | 21+--------------------
1 file changed, 1 insertion(+), 20 deletions(-)

diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig @@ -1337,25 +1337,6 @@ const Thread = struct { return @ptrFromInt(@as(usize, @bitCast(split))); } }; - - /// Same as `Io.Mutex.lock` but avoids the VTable. - fn mutexLock(m: *Io.Mutex) Io.Cancelable!void { - const initial_state = m.state.cmpxchgWeak( - .unlocked, - .locked_once, - .acquire, - .monotonic, - ) orelse { - @branchHint(.likely); - return; - }; - if (initial_state == .contended) { - try Thread.futexWait(@ptrCast(&m.state.raw), @intFromEnum(Io.Mutex.State.contended), null); - } - while (m.state.swap(.contended, .acquire) != .unlocked) { - try Thread.futexWait(@ptrCast(&m.state.raw), @intFromEnum(Io.Mutex.State.contended), null); - } - } }; const Syscall = struct { @@ -18663,7 +18644,7 @@ fn condWait(cond: *Io.Condition, mutex: *Io.Mutex) void { /// Same as `Io.Mutex.lockUncancelable` but avoids the VTable. pub fn mutexLock(m: *Io.Mutex) void { - const initial_state = m.state.cmpxchgWeak( + const initial_state = m.state.cmpxchgStrong( .unlocked, .locked_once, .acquire,