diff options
| author | Loris Cro <kappaloris@gmail.com> | 2020-06-19 23:34:02 +0200 |
|---|---|---|
| committer | Loris Cro <kappaloris@gmail.com> | 2020-09-24 22:06:03 +0200 |
| commit | 18f6629bd8ad8bd13108ddce82c32baf6f53628e (patch) | |
| tree | 20550ae733e4516a5db6842aa15f3153be1d6146 /lib | |
| parent | 9075f8e5a1a788770cc8193d6f54118434e72a4b (diff) | |
| download | zig-18f6629bd8ad8bd13108ddce82c32baf6f53628e.tar.gz zig-18f6629bd8ad8bd13108ddce82c32baf6f53628e.zip | |
writev
Signed-off-by: Loris Cro <kappaloris@gmail.com>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/std/event/loop.zig | 40 | ||||
| -rw-r--r-- | lib/std/fs/file.zig | 8 | ||||
| -rw-r--r-- | lib/std/os.zig | 7 |
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, |
