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 {...@@ -1022,7 +1022,7 @@ pub const Loop = struct {
10221022
1023 /// Performs an async `os.pwrite` using a separate thread.1023 /// Performs an async `os.pwrite` using a separate thread.
1024 /// `fd` must block and not return EAGAIN.1024 /// `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 {
1026 if (simulate_evented) {1026 if (simulate_evented) {
1027 var req_node = Request.Node{1027 var req_node = Request.Node{
1028 .data = .{1028 .data = .{
...@@ -1056,24 +1056,36 @@ pub const Loop = struct {...@@ -1056,24 +1056,36 @@ pub const Loop = struct {
10561056
1057 /// Performs an async `os.pwritev` using a separate thread.1057 /// Performs an async `os.pwritev` using a separate thread.
1058 /// `fd` must block and not return EAGAIN.1058 /// `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 {1059 pub fn pwritev(self: *Loop, fd: os.fd_t, iov: []const os.iovec_const, offset: u64, simulate_evented: bool) os.PWriteError!usize {
1060 var req_node = Request.Node{1060 if (simulate_evented) {
1061 .data = .{1061 var req_node = Request.Node{
1062 .msg = .{1062 .data = .{
1063 .pwritev = .{1063 .msg = .{
1064 .fd = fd,1064 .pwritev = .{
1065 .iov = iov,1065 .fd = fd,
1066 .offset = offset,1066 .iov = iov,
1067 .result = undefined,1067 .offset = offset,
1068 .result = undefined,
1069 },
1068 },1070 },
1071 .finish = .{ .TickNode = .{ .data = @frame() } },
1069 },1072 },
1070 .finish = .{ .TickNode = .{ .data = @frame() } },1073 };
1071 },1074 suspend {
1072 };1075 self.posixFsRequest(&req_node);
1073 suspend {1076 }
1074 self.posixFsRequest(&req_node);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 }
1075 }1088 }
1076 return req_node.data.msg.pwritev.result;
1077 }1089 }
10781090
1079 /// Performs an async `os.faccessatZ` using a separate thread.1091 /// Performs an async `os.faccessatZ` using a separate thread.
lib/std/fs/file.zig+5-3
...@@ -621,10 +621,12 @@ pub const File = struct {...@@ -621,10 +621,12 @@ pub const File = struct {
621 if (iovecs.len == 0) return @as(usize, 0);621 if (iovecs.len == 0) return @as(usize, 0);
622 const first = iovecs[0];622 const first = iovecs[0];
623 return windows.WriteFile(self.handle, first.iov_base[0..first.iov_len], offset, self.intended_io_mode);623 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) {624 }
625 return std.event.Loop.instance.?.pwritev(self.handle, iovecs, offset);625
626 } else {626 if (self.intended_io_mode == .blocking) {
627 return os.pwritev(self.handle, iovecs, offset);627 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);
628 }630 }
629 }631 }
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...@@ -958,12 +958,7 @@ pub fn pwritev(fd: fd_t, iov: []const iovec_const, offset: u64) PWriteError!usiz
958 EINTR => continue,958 EINTR => continue,
959 EINVAL => unreachable,959 EINVAL => unreachable,
960 EFAULT => unreachable,960 EFAULT => unreachable,
961 EAGAIN => if (std.event.Loop.instance) |loop| {961 EAGAIN => return error.WouldBlock,
962 loop.waitUntilFdWritable(fd);
963 continue;
964 } else {
965 return error.WouldBlock;
966 },
967 EBADF => return error.NotOpenForWriting, // Can be a race condition.962 EBADF => return error.NotOpenForWriting, // Can be a race condition.
968 EDESTADDRREQ => unreachable, // `connect` was never called.963 EDESTADDRREQ => unreachable, // `connect` was never called.
969 EDQUOT => return error.DiskQuota,964 EDQUOT => return error.DiskQuota,