zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit cc11dd1f87d0e16e9af4d80b28dbe2f0d1a7e3b2 (tree)
parent 0497f88d397276413edce8371b89825215c802b0
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Thu, 23 Oct 2025 04:46:00 -0700

std.Io.Kqueue: implement EAGAIN logic for netRead

Diffstat:
Mlib/std/Io/Kqueue.zig | 20+++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/lib/std/Io/Kqueue.zig b/lib/std/Io/Kqueue.zig @@ -1456,7 +1456,25 @@ fn netRead(userdata: ?*anyopaque, fd: net.Socket.Handle, data: [][]u8) net.Strea .SUCCESS => return @intCast(rc), .INTR => continue, .CANCELED => return error.Canceled, - .AGAIN => @panic("TODO"), + .AGAIN => { + const thread: *Thread = .current(); + const fiber = thread.currentFiber(); + const changes = [_]posix.Kevent{ + .{ + .ident = @as(u32, @bitCast(fd)), + .filter = std.c.EVFILT.READ, + .flags = std.c.EV.ADD | std.c.EV.ONESHOT, + .fflags = 0, + .data = 0, + .udata = @intFromPtr(fiber), + }, + }; + assert(0 == (posix.kevent(thread.kq_fd, &changes, &.{}, null) catch |err| { + @panic(@errorName(err)); // TODO + })); + yield(k, null, .nothing); + continue; + }, .INVAL => |err| return errnoBug(err), .FAULT => |err| return errnoBug(err),