| author | |
| committer | |
| log | 59ecdaea127cb680d295ad02319dacba75ac1e73 |
| tree | adac6a902a2af4e50cc45c9f7297a90bcae9ec23 |
| parent | bd9f2369d5c4e5fcd38342c877f9ae6531f78909 |
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 | 922 | |
| 923 | 923 | /// Performs an async `os.preadv` using a separate thread. |
| 924 | 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 { | |
| 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 | }, | |
| 934 | 936 | }, |
| 937 | .finish = .{ .TickNode = .{ .data = @frame() } }, | |
| 935 | 938 | }, |
| 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 | } | |
| 941 | 954 | } |
| 942 | return req_node.data.msg.preadv.result; | |
| 943 | 955 | } |
| 944 | 956 | |
| 945 | 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 | 506 | if (iovecs.len == 0) return @as(usize, 0); |
| 507 | 507 | const first = iovecs[0]; |
| 508 | 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) { | |
| 510 | return std.event.Loop.instance.?.preadv(self.handle, iovecs, offset); | |
| 511 | } else { | |
| 509 | } | |
| 510 | ||
| 511 | if (self.intended_io_mode == .blocking) { | |
| 512 | 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 | } |
| 515 | 517 |
lib/std/os.zig+1-6| ... | ... | @@ -622,12 +622,7 @@ pub fn preadv(fd: fd_t, iov: []const iovec, offset: u64) PReadError!usize { |
| 622 | 622 | EINTR => continue, |
| 623 | 623 | EINVAL => unreachable, |
| 624 | 624 | 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, | |
| 631 | 626 | EBADF => return error.NotOpenForReading, // can be a race condition |
| 632 | 627 | EIO => return error.InputOutput, |
| 633 | 628 | EISDIR => return error.IsDir, |