From aacf8ce03d2b52e52830873c40eabb1cb1eb8272 Mon Sep 17 00:00:00 2001 From: Jake Greenfield Date: Sun, 1 Feb 2026 22:04:20 -0500 Subject: [PATCH] Use MultiReader in `zig std` --- lib/compiler/std-docs.zig | 42 +++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/lib/compiler/std-docs.zig b/lib/compiler/std-docs.zig index 55f49c44e27d2aef6d0a7d513317454f1a3a44d2..72a8c74ff2ce89925f087a32517453b612226b43 100644 --- 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; - 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; + var eos_err: error{EndOfStream}!void = {}; + + 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; -- 2.54.0