authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-02-01 14:57:27-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-02-02 10:44:50-08:00
log633eb247ab819d7120fea2e0178100cc8fca8ac3
tree0dc4e758016d488a5404b0b3ee7419906608ea6a
parentb191e50be58cde6589a70410fb2f40ec43d0ffad

std.Io.Event: fix single-threaded implementation


2 files changed, 6 insertions(+), 3 deletions(-)

lib/std/Io.zig+1-1
...@@ -1467,7 +1467,7 @@ pub const Event = enum(u32) {...@@ -1467,7 +1467,7 @@ pub const Event = enum(u32) {
1467 pub fn waitTimeout(event: *Event, io: Io, timeout: Timeout) WaitTimeoutError!void {1467 pub fn waitTimeout(event: *Event, io: Io, timeout: Timeout) WaitTimeoutError!void {
1468 if (@cmpxchgStrong(Event, event, .unset, .waiting, .acquire, .acquire)) |prev| switch (prev) {1468 if (@cmpxchgStrong(Event, event, .unset, .waiting, .acquire, .acquire)) |prev| switch (prev) {
1469 .unset => unreachable,1469 .unset => unreachable,
1470 .waiting => assert(!builtin.single_threaded), // invalid state1470 .waiting => {},
1471 .is_set => return,1471 .is_set => return,
1472 };1472 };
1473 errdefer {1473 errdefer {
lib/std/Io/Threaded.zig+5-2
...@@ -2461,7 +2461,10 @@ fn cancel(...@@ -2461,7 +2461,10 @@ fn cancel(
2461}2461}
24622462
2463fn futexWait(userdata: ?*anyopaque, ptr: *const u32, expected: u32, timeout: Io.Timeout) Io.Cancelable!void {2463fn futexWait(userdata: ?*anyopaque, ptr: *const u32, expected: u32, timeout: Io.Timeout) Io.Cancelable!void {
2464 if (builtin.single_threaded) unreachable; // Deadlock.2464 if (builtin.single_threaded) {
2465 assert(timeout != .none); // Deadlock.
2466 return;
2467 }
2465 const t: *Threaded = @ptrCast(@alignCast(userdata));2468 const t: *Threaded = @ptrCast(@alignCast(userdata));
2466 const t_io = ioBasic(t);2469 const t_io = ioBasic(t);
2467 const timeout_ns: ?u64 = ns: {2470 const timeout_ns: ?u64 = ns: {
...@@ -2479,7 +2482,7 @@ fn futexWaitUncancelable(userdata: ?*anyopaque, ptr: *const u32, expected: u32)...@@ -2479,7 +2482,7 @@ fn futexWaitUncancelable(userdata: ?*anyopaque, ptr: *const u32, expected: u32)
2479}2482}
24802483
2481fn futexWake(userdata: ?*anyopaque, ptr: *const u32, max_waiters: u32) void {2484fn futexWake(userdata: ?*anyopaque, ptr: *const u32, max_waiters: u32) void {
2482 if (builtin.single_threaded) unreachable; // Nothing to wake up.2485 if (builtin.single_threaded) return; // Nothing to wake up.
2483 const t: *Threaded = @ptrCast(@alignCast(userdata));2486 const t: *Threaded = @ptrCast(@alignCast(userdata));
2484 _ = t;2487 _ = t;
2485 Thread.futexWake(ptr, max_waiters);2488 Thread.futexWake(ptr, max_waiters);