authorgravatar for jake@greenfield.shJake Greenfield <jake@greenfield.sh> 2026-02-01 22:04:20-05:00
committergravatar for jake@greenfield.shJake Greenfield <jake@greenfield.sh> 2026-02-01 22:22:47-05:00
logaacf8ce03d2b52e52830873c40eabb1cb1eb8272
treecd55f68322f6ae960db1d362fd68af6e817017b8
parent37d14a4f3ba8993533cc0cf76cf295ba50ea8fed

Use MultiReader in `zig std`


1 files changed, 27 insertions(+), 15 deletions(-)

lib/compiler/std-docs.zig+27-15
...@@ -324,11 +324,10 @@ fn buildWasmBinary(...@@ -324,11 +324,10 @@ fn buildWasmBinary(
324 .stderr = .pipe,324 .stderr = .pipe,
325 });325 });
326326
327 var poller = Io.poll(gpa, enum { stdout, stderr }, .{327 var multi_reader_buffer: Io.File.MultiReader.Buffer(2) = undefined;
328 .stdout = child.stdout.?,328 var multi_reader: Io.File.MultiReader = undefined;
329 .stderr = child.stderr.?,329 multi_reader.init(gpa, io, multi_reader_buffer.toStreams(), &.{ child.stdout.?, child.stderr.? });
330 });330 defer multi_reader.deinit();
331 defer poller.deinit();
332331
333 try sendMessage(io, child.stdin.?, .update);332 try sendMessage(io, child.stdin.?, .update);
334 try sendMessage(io, child.stdin.?, .exit);333 try sendMessage(io, child.stdin.?, .exit);
...@@ -336,14 +335,23 @@ fn buildWasmBinary(...@@ -336,14 +335,23 @@ fn buildWasmBinary(
336 var result: ?Cache.Path = null;335 var result: ?Cache.Path = null;
337 var result_error_bundle = std.zig.ErrorBundle.empty;336 var result_error_bundle = std.zig.ErrorBundle.empty;
338337
339 const stdout = poller.reader(.stdout);338 const stdout = multi_reader.fileReader(0);
339 const MessageHeader = std.zig.Server.Message.Header;
340
341 var eos_err: error{EndOfStream}!void = {};
340342
341 poll: while (true) {343 while (true) {
342 const Header = std.zig.Server.Message.Header;344 const header = stdout.interface.takeStruct(MessageHeader, .little) catch |err| switch (err) {
343 while (stdout.buffered().len < @sizeOf(Header)) if (!try poller.poll()) break :poll;345 error.EndOfStream => break,
344 const header = stdout.takeStruct(Header, .little) catch unreachable;346 error.ReadFailed => return stdout.err.?,
345 while (stdout.buffered().len < header.bytes_len) if (!try poller.poll()) break :poll;347 };
346 const body = stdout.take(header.bytes_len) catch unreachable;348 const body = stdout.interface.take(header.bytes_len) catch |err| switch (err) {
349 error.EndOfStream => |e| {
350 eos_err = e;
351 break;
352 },
353 error.ReadFailed => return stdout.err.?,
354 };
347355
348 switch (header.tag) {356 switch (header.tag) {
349 .zig_version => {357 .zig_version => {
...@@ -372,11 +380,15 @@ fn buildWasmBinary(...@@ -372,11 +380,15 @@ fn buildWasmBinary(
372 }380 }
373 }381 }
374382
375 const stderr = poller.reader(.stderr);383 try multi_reader.fillRemaining(.none);
376 if (stderr.bufferedLen() > 0) {384 const stderr = multi_reader.reader(1).buffered();
377 std.debug.print("{s}", .{stderr.buffered()});385
386 if (stderr.len > 0) {
387 std.debug.print("{s}", .{stderr});
378 }388 }
379389
390 try eos_err;
391
380 // Send EOF to stdin.392 // Send EOF to stdin.
381 child.stdin.?.close(io);393 child.stdin.?.close(io);
382 child.stdin = null;394 child.stdin = null;