commit aacf8ce03d2b52e52830873c40eabb1cb1eb8272 (tree)
parent 37d14a4f3ba8993533cc0cf76cf295ba50ea8fed
Author: Jake Greenfield <jake@greenfield.sh>
Date: Sun, 1 Feb 2026 22:04:20 -0500
Use MultiReader in `zig std`
Diffstat:
1 file changed, 27 insertions(+), 15 deletions(-)
diff --git a/lib/compiler/std-docs.zig b/lib/compiler/std-docs.zig
@@ -324,11 +324,10 @@ fn buildWasmBinary(
.stderr = .pipe,
});
- var poller = Io.poll(gpa, enum { stdout, stderr }, .{
- .stdout = child.stdout.?,
- .stderr = child.stderr.?,
- });
- defer poller.deinit();
+ var multi_reader_buffer: Io.File.MultiReader.Buffer(2) = undefined;
+ var multi_reader: Io.File.MultiReader = undefined;
+ multi_reader.init(gpa, io, multi_reader_buffer.toStreams(), &.{ child.stdout.?, child.stderr.? });
+ defer multi_reader.deinit();
try sendMessage(io, child.stdin.?, .update);
try sendMessage(io, child.stdin.?, .exit);
@@ -336,14 +335,23 @@ fn buildWasmBinary(
var result: ?Cache.Path = null;
var result_error_bundle = std.zig.ErrorBundle.empty;
- const stdout = poller.reader(.stdout);
+ const stdout = multi_reader.fileReader(0);
+ const MessageHeader = std.zig.Server.Message.Header;
+
+ var eos_err: error{EndOfStream}!void = {};
- poll: while (true) {
- const Header = std.zig.Server.Message.Header;
- while (stdout.buffered().len < @sizeOf(Header)) if (!try poller.poll()) break :poll;
- const header = stdout.takeStruct(Header, .little) catch unreachable;
- while (stdout.buffered().len < header.bytes_len) if (!try poller.poll()) break :poll;
- const body = stdout.take(header.bytes_len) catch unreachable;
+ while (true) {
+ const header = stdout.interface.takeStruct(MessageHeader, .little) catch |err| switch (err) {
+ error.EndOfStream => break,
+ error.ReadFailed => return stdout.err.?,
+ };
+ const body = stdout.interface.take(header.bytes_len) catch |err| switch (err) {
+ error.EndOfStream => |e| {
+ eos_err = e;
+ break;
+ },
+ error.ReadFailed => return stdout.err.?,
+ };
switch (header.tag) {
.zig_version => {
@@ -372,11 +380,15 @@ fn buildWasmBinary(
}
}
- const stderr = poller.reader(.stderr);
- if (stderr.bufferedLen() > 0) {
- std.debug.print("{s}", .{stderr.buffered()});
+ try multi_reader.fillRemaining(.none);
+ const stderr = multi_reader.reader(1).buffered();
+
+ if (stderr.len > 0) {
+ std.debug.print("{s}", .{stderr});
}
+ try eos_err;
+
// Send EOF to stdin.
child.stdin.?.close(io);
child.stdin = null;