diff options
| author | Loris Cro <kappaloris@gmail.com> | 2020-06-19 23:08:34 +0200 |
|---|---|---|
| committer | Loris Cro <kappaloris@gmail.com> | 2020-09-24 22:04:05 +0200 |
| commit | bd9f2369d5c4e5fcd38342c877f9ae6531f78909 (patch) | |
| tree | dff3bdfb5bb5ceaa552ef2aa06476518b145af89 /lib/std/event | |
| parent | bc35435ca6e51d0e120538398e3c708ada57f6de (diff) | |
| download | zig-bd9f2369d5c4e5fcd38342c877f9ae6531f78909.tar.gz zig-bd9f2369d5c4e5fcd38342c877f9ae6531f78909.zip | |
pread
Signed-off-by: Loris Cro <kappaloris@gmail.com>
Diffstat (limited to 'lib/std/event')
| -rw-r--r-- | lib/std/event/loop.zig | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/lib/std/event/loop.zig b/lib/std/event/loop.zig index 96774e3f11..27c00b9ab3 100644 --- a/lib/std/event/loop.zig +++ b/lib/std/event/loop.zig @@ -888,24 +888,36 @@ pub const Loop = struct { /// Performs an async `os.pread` using a separate thread. /// `fd` must block and not return EAGAIN. - pub fn pread(self: *Loop, fd: os.fd_t, buf: []u8, offset: u64) os.PReadError!usize { - var req_node = Request.Node{ - .data = .{ - .msg = .{ - .pread = .{ - .fd = fd, - .buf = buf, - .offset = offset, - .result = undefined, + pub fn pread(self: *Loop, fd: os.fd_t, buf: []u8, offset: u64, simulate_evented: bool) os.PReadError!usize { + if (simulate_evented) { + var req_node = Request.Node{ + .data = .{ + .msg = .{ + .pread = .{ + .fd = fd, + .buf = buf, + .offset = offset, + .result = undefined, + }, }, + .finish = .{ .TickNode = .{ .data = @frame() } }, }, - .finish = .{ .TickNode = .{ .data = @frame() } }, - }, - }; - suspend { - self.posixFsRequest(&req_node); + }; + suspend { + self.posixFsRequest(&req_node); + } + return req_node.data.msg.pread.result; + } else { + while (true) { + return os.pread(fd, buf, offset) catch |err| switch (err) { + error.WouldBlock => { + self.waitUntilFdReadable(fd); + continue; + }, + else => return err, + }; + } } - return req_node.data.msg.pread.result; } /// Performs an async `os.preadv` using a separate thread. |
