feature. See also
. The project being documented here (as the example) is the Zig library itself.
Dispatch.fileWriteStreaming
fn fileWriteStreaming(
ev: *Evented,
file: File,
header: []const u8,
data: []const []const u8,
splat: usize,
) File.Writer.Error!usize
File
Code
fn fileWriteStreaming(
ev: *Evented,
file: File,
header: []const u8,
data: []const []const u8,
splat: usize,
) File.Writer.Error!usize {
if (file.flags.nonblocking) nonblocking: {
return fileWriteStreamingLimit(
file.handle,
header,
data,
splat,
.unlimited,
) catch |err| switch (err) {
error.WouldBlock => break :nonblocking,
else => |e| return e,
};
}
const source = c.dispatch.source_create(
.WRITE,
@bitCast(@as(isize, file.handle)),
.none,
ev.queue,
) orelse return error.SystemResources;
source.as_object().set_context(Thread.current().currentFiber());
source.set_event_handler(&Fiber.@"resume");
ev.yield(.{ .activate = source.as_object() });
const limit = source.get_data();
source.as_object().release();
while (true) return fileWriteStreamingLimit(
file.handle,
header,
data,
splat,
.limited(limit),
) catch |err| switch (err) {
error.WouldBlock => {
ev.yield(.nothing);
continue;
},
else => |e| return e,
};
}