| author | |
| committer | |
| log | bd9f2369d5c4e5fcd38342c877f9ae6531f78909 |
| tree | dff3bdfb5bb5ceaa552ef2aa06476518b145af89 |
| parent | bc35435ca6e51d0e120538398e3c708ada57f6de |
Signed-off-by: Loris Cro <kappaloris@gmail.com>3 files changed, 33 insertions(+), 24 deletions(-)
lib/std/event/loop.zig+27-15| ... | ... | @@ -888,24 +888,36 @@ pub const Loop = struct { |
| 888 | 888 | |
| 889 | 889 | /// Performs an async `os.pread` using a separate thread. |
| 890 | 890 | /// `fd` must block and not return EAGAIN. |
| 891 | pub fn pread(self: *Loop, fd: os.fd_t, buf: []u8, offset: u64) os.PReadError!usize { | |
| 892 | var req_node = Request.Node{ | |
| 893 | .data = .{ | |
| 894 | .msg = .{ | |
| 895 | .pread = .{ | |
| 896 | .fd = fd, | |
| 897 | .buf = buf, | |
| 898 | .offset = offset, | |
| 899 | .result = undefined, | |
| 891 | pub fn pread(self: *Loop, fd: os.fd_t, buf: []u8, offset: u64, simulate_evented: bool) os.PReadError!usize { | |
| 892 | if (simulate_evented) { | |
| 893 | var req_node = Request.Node{ | |
| 894 | .data = .{ | |
| 895 | .msg = .{ | |
| 896 | .pread = .{ | |
| 897 | .fd = fd, | |
| 898 | .buf = buf, | |
| 899 | .offset = offset, | |
| 900 | .result = undefined, | |
| 901 | }, | |
| 900 | 902 | }, |
| 903 | .finish = .{ .TickNode = .{ .data = @frame() } }, | |
| 901 | 904 | }, |
| 902 | .finish = .{ .TickNode = .{ .data = @frame() } }, | |
| 903 | }, | |
| 904 | }; | |
| 905 | suspend { | |
| 906 | self.posixFsRequest(&req_node); | |
| 905 | }; | |
| 906 | suspend { | |
| 907 | self.posixFsRequest(&req_node); | |
| 908 | } | |
| 909 | return req_node.data.msg.pread.result; | |
| 910 | } else { | |
| 911 | while (true) { | |
| 912 | return os.pread(fd, buf, offset) catch |err| switch (err) { | |
| 913 | error.WouldBlock => { | |
| 914 | self.waitUntilFdReadable(fd); | |
| 915 | continue; | |
| 916 | }, | |
| 917 | else => return err, | |
| 918 | }; | |
| 919 | } | |
| 907 | 920 | } |
| 908 | return req_node.data.msg.pread.result; | |
| 909 | 921 | } |
| 910 | 922 | |
| 911 | 923 | /// Performs an async `os.preadv` using a separate thread. |
lib/std/fs/file.zig+5-3| ... | ... | @@ -438,10 +438,12 @@ pub const File = struct { |
| 438 | 438 | pub fn pread(self: File, buffer: []u8, offset: u64) PReadError!usize { |
| 439 | 439 | if (is_windows) { |
| 440 | 440 | return windows.ReadFile(self.handle, buffer, offset, self.intended_io_mode); |
| 441 | } else if (self.capable_io_mode != self.intended_io_mode) { | |
| 442 | return std.event.Loop.instance.?.pread(self.handle, buffer, offset); | |
| 443 | } else { | |
| 441 | } | |
| 442 | ||
| 443 | if (self.intended_io_mode == .blocking) { | |
| 444 | 444 | return os.pread(self.handle, buffer, offset); |
| 445 | } else { | |
| 446 | return std.event.Loop.instance.?.pread(self.handle, buffer, offset, self.capable_io_mode != self.intended_io_mode); | |
| 445 | 447 | } |
| 446 | 448 | } |
| 447 | 449 |
lib/std/os.zig+1-6| ... | ... | @@ -482,12 +482,7 @@ pub fn pread(fd: fd_t, buf: []u8, offset: u64) PReadError!usize { |
| 482 | 482 | EINTR => continue, |
| 483 | 483 | EINVAL => unreachable, |
| 484 | 484 | EFAULT => unreachable, |
| 485 | EAGAIN => if (std.event.Loop.instance) |loop| { | |
| 486 | loop.waitUntilFdReadable(fd); | |
| 487 | continue; | |
| 488 | } else { | |
| 489 | return error.WouldBlock; | |
| 490 | }, | |
| 485 | EAGAIN => return error.WouldBlock, | |
| 491 | 486 | EBADF => return error.NotOpenForReading, // Can be a race condition. |
| 492 | 487 | EIO => return error.InputOutput, |
| 493 | 488 | EISDIR => return error.IsDir, |