From 29355ff21c44e2c2f3ba7be019ceb2bdbfb7fc6f Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Fri, 28 Mar 2025 09:13:07 -0400 Subject: 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. --- lib/std/Io/EventLoop.zig | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'lib/std/Io/EventLoop.zig') 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); + } } }; -- cgit v1.2.3