authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-23 04:46:00-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-29 06:20:51-07:00
logcc11dd1f87d0e16e9af4d80b28dbe2f0d1a7e3b2
treee5da12edc82588a5891bd6c3629725492dd8f62d
parent0497f88d397276413edce8371b89825215c802b0

std.Io.Kqueue: implement EAGAIN logic for netRead


1 files changed, 19 insertions(+), 1 deletions(-)

lib/std/Io/Kqueue.zig+19-1
...@@ -1456,7 +1456,25 @@ fn netRead(userdata: ?*anyopaque, fd: net.Socket.Handle, data: [][]u8) net.Strea...@@ -1456,7 +1456,25 @@ fn netRead(userdata: ?*anyopaque, fd: net.Socket.Handle, data: [][]u8) net.Strea
1456 .SUCCESS => return @intCast(rc),1456 .SUCCESS => return @intCast(rc),
1457 .INTR => continue,1457 .INTR => continue,
1458 .CANCELED => return error.Canceled,1458 .CANCELED => return error.Canceled,
1459 .AGAIN => @panic("TODO"),1459 .AGAIN => {
1460 const thread: *Thread = .current();
1461 const fiber = thread.currentFiber();
1462 const changes = [_]posix.Kevent{
1463 .{
1464 .ident = @as(u32, @bitCast(fd)),
1465 .filter = std.c.EVFILT.READ,
1466 .flags = std.c.EV.ADD | std.c.EV.ONESHOT,
1467 .fflags = 0,
1468 .data = 0,
1469 .udata = @intFromPtr(fiber),
1470 },
1471 };
1472 assert(0 == (posix.kevent(thread.kq_fd, &changes, &.{}, null) catch |err| {
1473 @panic(@errorName(err)); // TODO
1474 }));
1475 yield(k, null, .nothing);
1476 continue;
1477 },
14601478
1461 .INVAL => |err| return errnoBug(err),1479 .INVAL => |err| return errnoBug(err),
1462 .FAULT => |err| return errnoBug(err),1480 .FAULT => |err| return errnoBug(err),