Commit 29355ff21c

Jacob Young <jacobly0@users.noreply.github.com>
2025-03-28 14:13:07
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 parent 4c7c0c4
Changed files (1)
lib
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);
+        }
     }
 };