aboutsummaryrefslogtreecommitdiff
path: root/lib/std/event
diff options
context:
space:
mode:
authorLoris Cro <kappaloris@gmail.com>2020-06-19 23:13:54 +0200
committerLoris Cro <kappaloris@gmail.com>2020-09-24 22:04:43 +0200
commit59ecdaea127cb680d295ad02319dacba75ac1e73 (patch)
treeadac6a902a2af4e50cc45c9f7297a90bcae9ec23 /lib/std/event
parentbd9f2369d5c4e5fcd38342c877f9ae6531f78909 (diff)
downloadzig-59ecdaea127cb680d295ad02319dacba75ac1e73.tar.gz
zig-59ecdaea127cb680d295ad02319dacba75ac1e73.zip
preadv
Signed-off-by: Loris Cro <kappaloris@gmail.com>
Diffstat (limited to 'lib/std/event')
-rw-r--r--lib/std/event/loop.zig42
1 files changed, 27 insertions, 15 deletions
diff --git a/lib/std/event/loop.zig b/lib/std/event/loop.zig
index 27c00b9ab3..a14e798c50 100644
--- a/lib/std/event/loop.zig
+++ b/lib/std/event/loop.zig
@@ -922,24 +922,36 @@ pub const Loop = struct {
/// Performs an async `os.preadv` using a separate thread.
/// `fd` must block and not return EAGAIN.
- pub fn preadv(self: *Loop, fd: os.fd_t, iov: []const os.iovec, offset: u64) os.ReadError!usize {
- var req_node = Request.Node{
- .data = .{
- .msg = .{
- .preadv = .{
- .fd = fd,
- .iov = iov,
- .offset = offset,
- .result = undefined,
+ pub fn preadv(self: *Loop, fd: os.fd_t, iov: []const os.iovec, offset: u64, simulate_evented: bool) os.ReadError!usize {
+ if (simulate_evented) {
+ var req_node = Request.Node{
+ .data = .{
+ .msg = .{
+ .preadv = .{
+ .fd = fd,
+ .iov = iov,
+ .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.preadv.result;
+ } else {
+ while (true) {
+ return os.preadv(fd, iov, offset) catch |err| switch (err) {
+ error.WouldBlock => {
+ self.waitUntilFdReadable(fd);
+ continue;
+ },
+ else => return err,
+ };
+ }
}
- return req_node.data.msg.preadv.result;
}
/// Performs an async `os.write` using a separate thread.