diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2025-10-23 04:46:00 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-10-29 06:20:51 -0700 |
| commit | cc11dd1f87d0e16e9af4d80b28dbe2f0d1a7e3b2 (patch) | |
| tree | e5da12edc82588a5891bd6c3629725492dd8f62d /lib/std | |
| parent | 0497f88d397276413edce8371b89825215c802b0 (diff) | |
| download | zig-cc11dd1f87d0e16e9af4d80b28dbe2f0d1a7e3b2.tar.gz zig-cc11dd1f87d0e16e9af4d80b28dbe2f0d1a7e3b2.zip | |
std.Io.Kqueue: implement EAGAIN logic for netRead
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/Io/Kqueue.zig | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/lib/std/Io/Kqueue.zig b/lib/std/Io/Kqueue.zig index fa5f6033ef..3507c29462 100644 --- 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), |
