aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2025-03-28 09:13:07 -0400
committerAndrew Kelley <andrew@ziglang.org>2025-10-29 06:20:47 -0700
commit29355ff21c44e2c2f3ba7be019ceb2bdbfb7fc6f (patch)
tree1e0c8b35d8223bdd6eb700fc63cfd6e9621385a9 /lib/std
parent4c7c0c41784ac442590dd4838faaecc3344693b9 (diff)
downloadzig-29355ff21c44e2c2f3ba7be019ceb2bdbfb7fc6f.tar.gz
zig-29355ff21c44e2c2f3ba7be019ceb2bdbfb7fc6f.zip
EventLoop: fix incorrect alignment panic
When the previous fiber did not request to be registered as an awaiter, it may not have actually been a full blown `Fiber`, so only create the `Fiber` pointer when needed.
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/Io/EventLoop.zig7
1 files changed, 4 insertions, 3 deletions
diff --git a/lib/std/Io/EventLoop.zig b/lib/std/Io/EventLoop.zig
index fbab98ff00..065ddfa55f 100644
--- a/lib/std/Io/EventLoop.zig
+++ b/lib/std/Io/EventLoop.zig
@@ -84,7 +84,6 @@ pub fn io(el: *EventLoop) Io {
};
}
-
pub fn init(el: *EventLoop, gpa: Allocator) error{OutOfMemory}!void {
const threads_bytes = ((std.Thread.getCpuCount() catch 1) -| 1) * @sizeOf(Thread);
const idle_context_offset = std.mem.alignForward(usize, threads_bytes, @alignOf(Context));
@@ -231,9 +230,11 @@ const SwitchMessage = extern struct {
register_awaiter: ?*?*Fiber,
fn handle(message: *const SwitchMessage, el: *EventLoop) void {
- const prev_fiber: *Fiber = @alignCast(@fieldParentPtr("context", message.prev_context));
current_fiber_context = message.ready_context;
- if (message.register_awaiter) |awaiter| if (@atomicRmw(?*Fiber, awaiter, .Xchg, prev_fiber, .acq_rel) == Fiber.finished) el.schedule(prev_fiber);
+ if (message.register_awaiter) |awaiter| {
+ const prev_fiber: *Fiber = @alignCast(@fieldParentPtr("context", message.prev_context));
+ if (@atomicRmw(?*Fiber, awaiter, .Xchg, prev_fiber, .acq_rel) == Fiber.finished) el.schedule(prev_fiber);
+ }
}
};