feature. See also
. The project being documented here (as the example) is the Zig library itself.
Threaded.fileWriteStreamingWindows
fn fileWriteStreamingWindows(file: File, buffer: []const u8) File.Writer.Error!usize
File
Code
fn fileWriteStreamingWindows(file: File, buffer: []const u8) File.Writer.Error!usize {
assert(buffer.len != 0);
var iosb: windows.IO_STATUS_BLOCK = undefined;
if (file.flags.nonblocking) {
var done: bool = false;
switch (windows.ntdll.NtWriteFile(
file.handle,
null,
flagApc,
&done,
&iosb,
buffer.ptr,
@intCast(buffer.len),
null,
null,
)) {
.PENDING, .SUCCESS => while (!done) {
// operation completes, thereby releasing reference to io_status_block.
const alertable_syscall = AlertableSyscall.start() catch |err| switch (err) {
error.Canceled => |e| {
var cancel_iosb: windows.IO_STATUS_BLOCK = undefined;
_ = windows.ntdll.NtCancelIoFileEx(file.handle, &iosb, &cancel_iosb);
while (!done) waitForApcOrAlert();
return e;
},
};
waitForApcOrAlert();
alertable_syscall.finish();
},
else => |status| iosb.u.Status = status,
}
} else {
const syscall: Syscall = try .start();
while (true) switch (windows.ntdll.NtWriteFile(
file.handle,
null,
null,
null,
&iosb,
buffer.ptr,
@intCast(buffer.len),
null,
null,
)) {
.PENDING => unreachable,
.CANCELLED => try syscall.checkCancel(),
else => |status| {
syscall.finish();
iosb.u.Status = status;
break;
},
};
}
return ntWriteFileResult(&iosb);
}