aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorLoris Cro <kappaloris@gmail.com>2020-06-19 23:34:02 +0200
committerLoris Cro <kappaloris@gmail.com>2020-09-24 22:06:03 +0200
commit18f6629bd8ad8bd13108ddce82c32baf6f53628e (patch)
tree20550ae733e4516a5db6842aa15f3153be1d6146 /lib/std
parent9075f8e5a1a788770cc8193d6f54118434e72a4b (diff)
downloadzig-18f6629bd8ad8bd13108ddce82c32baf6f53628e.tar.gz
zig-18f6629bd8ad8bd13108ddce82c32baf6f53628e.zip
writev
Signed-off-by: Loris Cro <kappaloris@gmail.com>
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/event/loop.zig40
-rw-r--r--lib/std/fs/file.zig8
-rw-r--r--lib/std/os.zig7
3 files changed, 32 insertions, 23 deletions
diff --git a/lib/std/event/loop.zig b/lib/std/event/loop.zig
index ec45e85630..e5fdbd2e3a 100644
--- a/lib/std/event/loop.zig
+++ b/lib/std/event/loop.zig
@@ -989,23 +989,35 @@ pub const Loop = struct {
/// Performs an async `os.writev` using a separate thread.
/// `fd` must block and not return EAGAIN.
- pub fn writev(self: *Loop, fd: os.fd_t, iov: []const os.iovec_const) os.WriteError!usize {
- var req_node = Request.Node{
- .data = .{
- .msg = .{
- .writev = .{
- .fd = fd,
- .iov = iov,
- .result = undefined,
+ pub fn writev(self: *Loop, fd: os.fd_t, iov: []const os.iovec_const, simulate_evented: bool) os.WriteError!usize {
+ if (simulate_evented) {
+ var req_node = Request.Node{
+ .data = .{
+ .msg = .{
+ .writev = .{
+ .fd = fd,
+ .iov = iov,
+ .result = undefined,
+ },
},
+ .finish = .{ .TickNode = .{ .data = @frame() } },
},
- .finish = .{ .TickNode = .{ .data = @frame() } },
- },
- };
- suspend {
- self.posixFsRequest(&req_node);
+ };
+ suspend {
+ self.posixFsRequest(&req_node);
+ }
+ return req_node.data.msg.writev.result;
+ } else {
+ while (true) {
+ return os.writev(fd, iov) catch |err| switch (err) {
+ error.WouldBlock => {
+ self.waitUntilFdWritable(fd);
+ continue;
+ },
+ else => return err,
+ };
+ }
}
- return req_node.data.msg.writev.result;
}
/// Performs an async `os.pwritev` using a separate thread.
diff --git a/lib/std/fs/file.zig b/lib/std/fs/file.zig
index 428b758e61..ab7ea2f579 100644
--- a/lib/std/fs/file.zig
+++ b/lib/std/fs/file.zig
@@ -586,10 +586,12 @@ pub const File = struct {
if (iovecs.len == 0) return @as(usize, 0);
const first = iovecs[0];
return windows.WriteFile(self.handle, first.iov_base[0..first.iov_len], null, self.intended_io_mode);
- } else if (self.capable_io_mode != self.intended_io_mode) {
- return std.event.Loop.instance.?.writev(self.handle, iovecs);
- } else {
+ }
+
+ if (self.intended_io_mode == .blocking) {
return os.writev(self.handle, iovecs);
+ } else {
+ return std.event.Loop.instance.?.writev(self.handle, iovecs, self.capable_io_mode != self.intended_io_mode);
}
}
diff --git a/lib/std/os.zig b/lib/std/os.zig
index da5ce13508..8f761b48be 100644
--- a/lib/std/os.zig
+++ b/lib/std/os.zig
@@ -789,12 +789,7 @@ pub fn writev(fd: fd_t, iov: []const iovec_const) WriteError!usize {
EINTR => continue,
EINVAL => unreachable,
EFAULT => unreachable,
- EAGAIN => if (std.event.Loop.instance) |loop| {
- loop.waitUntilFdWritable(fd);
- continue;
- } else {
- return error.WouldBlock;
- },
+ EAGAIN => return error.WouldBlock,
EBADF => return error.NotOpenForWriting, // Can be a race condition.
EDESTADDRREQ => unreachable, // `connect` was never called.
EDQUOT => return error.DiskQuota,