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 {
922922
923923 /// Performs an async `os.preadv` using a separate thread.
924924 /// `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 {
926 var req_node = Request.Node{
927 .data = .{
928 .msg = .{
929 .preadv = .{
930 .fd = fd,
931 .iov = iov,
932 .offset = offset,
933 .result = undefined,
925 pub fn preadv(self: *Loop, fd: os.fd_t, iov: []const os.iovec, offset: u64, simulate_evented: bool) os.ReadError!usize {
926 if (simulate_evented) {
927 var req_node = Request.Node{
928 .data = .{
929 .msg = .{
930 .preadv = .{
931 .fd = fd,
932 .iov = iov,
933 .offset = offset,
934 .result = undefined,
935 },
934936 },
937 .finish = .{ .TickNode = .{ .data = @frame() } },
935938 },
936 .finish = .{ .TickNode = .{ .data = @frame() } },
937 },
938 };
939 suspend {
940 self.posixFsRequest(&req_node);
939 };
940 suspend {
941 self.posixFsRequest(&req_node);
942 }
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 }
941954 }
942 return req_node.data.msg.preadv.result;
943955 }
944956
945957 /// Performs an async `os.write` using a separate thread.
lib/std/fs/file.zig+5-3
......@@ -506,10 +506,12 @@ pub const File = struct {
506506 if (iovecs.len == 0) return @as(usize, 0);
507507 const first = iovecs[0];
508508 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) {
510 return std.event.Loop.instance.?.preadv(self.handle, iovecs, offset);
511 } else {
509 }
510
511 if (self.intended_io_mode == .blocking) {
512512 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);
513515 }
514516 }
515517
lib/std/os.zig+1-6
......@@ -622,12 +622,7 @@ pub fn preadv(fd: fd_t, iov: []const iovec, offset: u64) PReadError!usize {
622622 EINTR => continue,
623623 EINVAL => unreachable,
624624 EFAULT => unreachable,
625 EAGAIN => if (std.event.Loop.instance) |loop| {
626 loop.waitUntilFdReadable(fd);
627 continue;
628 } else {
629 return error.WouldBlock;
630 },
625 EAGAIN => return error.WouldBlock,
631626 EBADF => return error.NotOpenForReading, // can be a race condition
632627 EIO => return error.InputOutput,
633628 EISDIR => return error.IsDir,