From 38ae508c491783315b4199c669c07ba8ce74971d Mon Sep 17 00:00:00 2001 From: cozis Date: Tue, 2 Jun 2026 13:48:28 +0200 Subject: [PATCH] node: Add boolean argument to readSocket to switch between blocking and non-blocking mode --- src/io_interface.zig | 2 +- src/node.zig | 26 +++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/io_interface.zig b/src/io_interface.zig index a29066e..ab41a88 100644 --- a/src/io_interface.zig +++ b/src/io_interface.zig @@ -1215,7 +1215,7 @@ fn netRead(userdata: ?*anyopaque, fd: net.Socket.Handle, data: [][]u8) net.Strea if (buffer.len == 0) continue; - const n = node.readSocket(fd, buffer) catch |err| switch (err) { + const n = node.readSocket(fd, buffer, true) catch |err| switch (err) { error.InvalidHandle => return error.SocketUnconnected, }; copied += n; diff --git a/src/node.zig b/src/node.zig index 79f6392..a314ec6 100644 --- a/src/node.zig +++ b/src/node.zig @@ -417,10 +417,30 @@ pub fn connect(self: *Node, address: Address) ConnectError!Handle { return self.descToHandle(desc); } -pub fn readSocket(self: *Node, handle: Handle, target: []u8) HandleError!usize { - self.scheduler.sleep(10); +pub fn readSocket(self: *Node, handle: Handle, target: []u8, block: bool) HandleError!usize { + if (target.len == 0) + return 0; + const desc = try self.handleToDescOfType(handle, .conn); - return self.network_host.read(&desc.conn, target); + + if (block) { + while (true) { + self.scheduler.sleep(10); + + const num = self.network_host.read(&desc.conn, target); + + if (num > 0) + return num; + + if (num == 0) { + if (!self.network_host.isConnected(&desc.conn)) + return 0; + } + } + unreachable; + } else { + return self.network_host.read(&desc.conn, target); + } } pub const WriteSocketError = HandleError || Network.SendError;