authorgravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2020-06-20 00:19:38+02:00
committergravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2020-09-24 22:06:41+02:00
log7fec5b3def36bc73e9e48a777bcca838c4b86770
treeb76caf270955c1f0b13c5d274377631216dfa640
parent7a07c62a075ada32c5eca298e4ed6a4c8a14cf89

pwritev

Signed-off-by: Loris Cro <kappaloris@gmail.com>

3 files changed, 34 insertions(+), 25 deletions(-)

lib/std/event/loop.zig+28-16
......@@ -1022,7 +1022,7 @@ pub const Loop = struct {
10221022
10231023 /// Performs an async `os.pwrite` using a separate thread.
10241024 /// `fd` must block and not return EAGAIN.
1025 pub fn pwrite(self: *Loop, fd: os.fd_t, bytes: []const u8, offset: u64, simulate_evented: bool) os.PWriteError!usize {
1025 pub fn pwrite(self: *Loop, fd: os.fd_t, bytes: []const u8, offset: u64, simulate_evented: bool) os.PerformsWriteError!usize {
10261026 if (simulate_evented) {
10271027 var req_node = Request.Node{
10281028 .data = .{
......@@ -1056,24 +1056,36 @@ pub const Loop = struct {
10561056
10571057 /// Performs an async `os.pwritev` using a separate thread.
10581058 /// `fd` must block and not return EAGAIN.
1059 pub fn pwritev(self: *Loop, fd: os.fd_t, iov: []const os.iovec_const, offset: u64) os.PWriteError!usize {
1060 var req_node = Request.Node{
1061 .data = .{
1062 .msg = .{
1063 .pwritev = .{
1064 .fd = fd,
1065 .iov = iov,
1066 .offset = offset,
1067 .result = undefined,
1059 pub fn pwritev(self: *Loop, fd: os.fd_t, iov: []const os.iovec_const, offset: u64, simulate_evented: bool) os.PWriteError!usize {
1060 if (simulate_evented) {
1061 var req_node = Request.Node{
1062 .data = .{
1063 .msg = .{
1064 .pwritev = .{
1065 .fd = fd,
1066 .iov = iov,
1067 .offset = offset,
1068 .result = undefined,
1069 },
10681070 },
1071 .finish = .{ .TickNode = .{ .data = @frame() } },
10691072 },
1070 .finish = .{ .TickNode = .{ .data = @frame() } },
1071 },
1072 };
1073 suspend {
1074 self.posixFsRequest(&req_node);
1073 };
1074 suspend {
1075 self.posixFsRequest(&req_node);
1076 }
1077 return req_node.data.msg.pwritev.result;
1078 } else {
1079 while (true) {
1080 return os.pwritev(fd, iov, offset) catch |err| switch (err) {
1081 error.WouldBlock => {
1082 self.waitUntilFdWritable(fd);
1083 continue;
1084 },
1085 else => return err,
1086 };
1087 }
10751088 }
1076 return req_node.data.msg.pwritev.result;
10771089 }
10781090
10791091 /// Performs an async `os.faccessatZ` using a separate thread.
lib/std/fs/file.zig+5-3
......@@ -621,10 +621,12 @@ pub const File = struct {
621621 if (iovecs.len == 0) return @as(usize, 0);
622622 const first = iovecs[0];
623623 return windows.WriteFile(self.handle, first.iov_base[0..first.iov_len], offset, self.intended_io_mode);
624 } else if (self.capable_io_mode != self.intended_io_mode) {
625 return std.event.Loop.instance.?.pwritev(self.handle, iovecs, offset);
626 } else {
624 }
625
626 if (self.intended_io_mode == .blocking) {
627627 return os.pwritev(self.handle, iovecs, offset);
628 } else {
629 return std.event.Loop.instance.?.pwritev(self.handle, iovecs, offset, self.capable_io_mode != self.intended_io_mode);
628630 }
629631 }
630632
lib/std/os.zig+1-6
......@@ -958,12 +958,7 @@ pub fn pwritev(fd: fd_t, iov: []const iovec_const, offset: u64) PWriteError!usiz
958958 EINTR => continue,
959959 EINVAL => unreachable,
960960 EFAULT => unreachable,
961 EAGAIN => if (std.event.Loop.instance) |loop| {
962 loop.waitUntilFdWritable(fd);
963 continue;
964 } else {
965 return error.WouldBlock;
966 },
961 EAGAIN => return error.WouldBlock,
967962 EBADF => return error.NotOpenForWriting, // Can be a race condition.
968963 EDESTADDRREQ => unreachable, // `connect` was never called.
969964 EDQUOT => return error.DiskQuota,