From 0258b24d1f73c49045e3dc290cae8ee26202f111 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 25 Apr 2022 19:02:31 -0700 Subject: [PATCH] libuv: stream try_write --- src/libuv/Pipe.zig | 7 +++++++ src/libuv/stream.zig | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/libuv/Pipe.zig b/src/libuv/Pipe.zig index 30f916013..155b0b65a 100644 --- a/src/libuv/Pipe.zig +++ b/src/libuv/Pipe.zig @@ -127,6 +127,13 @@ test "Pipe" { // Check our data try testing.expectEqual(@as(usize, 5), data.data.items.len); try testing.expectEqualStrings("hello", data.data.items); + data.data.clearRetainingCapacity(); + + // Try writing directly + _ = try writer.tryWrite(&[_][]const u8{"world"}); + _ = try loop.run(.once); + try testing.expectEqual(@as(usize, 5), data.data.items.len); + try testing.expectEqualStrings("world", data.data.items); // End reader.readStop(); diff --git a/src/libuv/stream.zig b/src/libuv/stream.zig index 59518e3c2..832f9edec 100644 --- a/src/libuv/stream.zig +++ b/src/libuv/stream.zig @@ -63,6 +63,18 @@ pub fn Stream(comptime T: type) type { )); } + /// Same as uv_write(), but won’t queue a write request if it can’t + /// be completed immediately. + pub fn tryWrite(self: T, bufs: []const []const u8) !usize { + const res = c.uv_try_write( + @ptrCast(*c.uv_stream_t, self.handle), + @ptrCast([*c]const c.uv_buf_t, bufs.ptr), + @intCast(c_uint, bufs.len), + ); + try errors.convertError(res); + return @intCast(usize, res); + } + /// Read data from an incoming stream. The uv_read_cb callback will /// be made several times until there is no more data to read or /// uv_read_stop() is called.