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