authorgravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2020-06-19 23:13:54+02:00
committergravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2020-09-24 22:04:43+02:00
log59ecdaea127cb680d295ad02319dacba75ac1e73
treeadac6a902a2af4e50cc45c9f7297a90bcae9ec23
parentbd9f2369d5c4e5fcd38342c877f9ae6531f78909

preadv

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

3 files changed, 33 insertions(+), 24 deletions(-)

lib/std/event/loop.zig+27-15
...@@ -922,24 +922,36 @@ pub const Loop = struct {...@@ -922,24 +922,36 @@ pub const Loop = struct {
922922
923 /// Performs an async `os.preadv` using a separate thread.923 /// Performs an async `os.preadv` using a separate thread.
924 /// `fd` must block and not return EAGAIN.924 /// `fd` must block and not return EAGAIN.
925 pub fn preadv(self: *Loop, fd: os.fd_t, iov: []const os.iovec, offset: u64) os.ReadError!usize {925 pub fn preadv(self: *Loop, fd: os.fd_t, iov: []const os.iovec, offset: u64, simulate_evented: bool) os.ReadError!usize {
926 var req_node = Request.Node{926 if (simulate_evented) {
927 .data = .{927 var req_node = Request.Node{
928 .msg = .{928 .data = .{
929 .preadv = .{929 .msg = .{
930 .fd = fd,930 .preadv = .{
931 .iov = iov,931 .fd = fd,
932 .offset = offset,932 .iov = iov,
933 .result = undefined,933 .offset = offset,
934 .result = undefined,
935 },
934 },936 },
937 .finish = .{ .TickNode = .{ .data = @frame() } },
935 },938 },
936 .finish = .{ .TickNode = .{ .data = @frame() } },939 };
937 },940 suspend {
938 };941 self.posixFsRequest(&req_node);
939 suspend {942 }
940 self.posixFsRequest(&req_node);943 return req_node.data.msg.preadv.result;
944 } else {
945 while (true) {
946 return os.preadv(fd, iov, offset) catch |err| switch (err) {
947 error.WouldBlock => {
948 self.waitUntilFdReadable(fd);
949 continue;
950 },
951 else => return err,
952 };
953 }
941 }954 }
942 return req_node.data.msg.preadv.result;
943 }955 }
944956
945 /// Performs an async `os.write` using a separate thread.957 /// Performs an async `os.write` using a separate thread.
lib/std/fs/file.zig+5-3
...@@ -506,10 +506,12 @@ pub const File = struct {...@@ -506,10 +506,12 @@ pub const File = struct {
506 if (iovecs.len == 0) return @as(usize, 0);506 if (iovecs.len == 0) return @as(usize, 0);
507 const first = iovecs[0];507 const first = iovecs[0];
508 return windows.ReadFile(self.handle, first.iov_base[0..first.iov_len], offset, self.intended_io_mode);508 return windows.ReadFile(self.handle, first.iov_base[0..first.iov_len], offset, self.intended_io_mode);
509 } else if (self.capable_io_mode != self.intended_io_mode) {509 }
510 return std.event.Loop.instance.?.preadv(self.handle, iovecs, offset);510
511 } else {511 if (self.intended_io_mode == .blocking) {
512 return os.preadv(self.handle, iovecs, offset);512 return os.preadv(self.handle, iovecs, offset);
513 } else {
514 return std.event.Loop.instance.?.preadv(self.handle, iovecs, offset, self.capable_io_mode != self.intended_io_mode);
513 }515 }
514 }516 }
515517
lib/std/os.zig+1-6
...@@ -622,12 +622,7 @@ pub fn preadv(fd: fd_t, iov: []const iovec, offset: u64) PReadError!usize {...@@ -622,12 +622,7 @@ pub fn preadv(fd: fd_t, iov: []const iovec, offset: u64) PReadError!usize {
622 EINTR => continue,622 EINTR => continue,
623 EINVAL => unreachable,623 EINVAL => unreachable,
624 EFAULT => unreachable,624 EFAULT => unreachable,
625 EAGAIN => if (std.event.Loop.instance) |loop| {625 EAGAIN => return error.WouldBlock,
626 loop.waitUntilFdReadable(fd);
627 continue;
628 } else {
629 return error.WouldBlock;
630 },
631 EBADF => return error.NotOpenForReading, // can be a race condition626 EBADF => return error.NotOpenForReading, // can be a race condition
632 EIO => return error.InputOutput,627 EIO => return error.InputOutput,
633 EISDIR => return error.IsDir,628 EISDIR => return error.IsDir,