authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-03-28 09:13:07-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-02 16:30:59-07:00
logdfbf68e5fa711655462622bd4b75a8f01d622032
tree87af5bc9c621266ffc63664b3b4f8d3b901aae75
parent3ee239963094ee0268210f8afc95ba6518b61ad4

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.

1 files changed, 4 insertions(+), 3 deletions(-)

lib/std/Io/EventLoop.zig+4-3
...@@ -84,7 +84,6 @@ pub fn io(el: *EventLoop) Io {...@@ -84,7 +84,6 @@ pub fn io(el: *EventLoop) Io {
84 };84 };
85}85}
8686
87
88pub fn init(el: *EventLoop, gpa: Allocator) error{OutOfMemory}!void {87pub fn init(el: *EventLoop, gpa: Allocator) error{OutOfMemory}!void {
89 const threads_bytes = ((std.Thread.getCpuCount() catch 1) -| 1) * @sizeOf(Thread);88 const threads_bytes = ((std.Thread.getCpuCount() catch 1) -| 1) * @sizeOf(Thread);
90 const idle_context_offset = std.mem.alignForward(usize, threads_bytes, @alignOf(Context));89 const idle_context_offset = std.mem.alignForward(usize, threads_bytes, @alignOf(Context));
...@@ -231,9 +230,11 @@ const SwitchMessage = extern struct {...@@ -231,9 +230,11 @@ const SwitchMessage = extern struct {
231 register_awaiter: ?*?*Fiber,230 register_awaiter: ?*?*Fiber,
232231
233 fn handle(message: *const SwitchMessage, el: *EventLoop) void {232 fn handle(message: *const SwitchMessage, el: *EventLoop) void {
234 const prev_fiber: *Fiber = @alignCast(@fieldParentPtr("context", message.prev_context));
235 current_fiber_context = message.ready_context;233 current_fiber_context = message.ready_context;
236 if (message.register_awaiter) |awaiter| if (@atomicRmw(?*Fiber, awaiter, .Xchg, prev_fiber, .acq_rel) == Fiber.finished) el.schedule(prev_fiber);234 if (message.register_awaiter) |awaiter| {
235 const prev_fiber: *Fiber = @alignCast(@fieldParentPtr("context", message.prev_context));
236 if (@atomicRmw(?*Fiber, awaiter, .Xchg, prev_fiber, .acq_rel) == Fiber.finished) el.schedule(prev_fiber);
237 }
237 }238 }
238};239};
239240