| ... | @@ -324,11 +324,10 @@ fn buildWasmBinary( | ... | @@ -324,11 +324,10 @@ fn buildWasmBinary( |
| 324 | .stderr = .pipe, | 324 | .stderr = .pipe, |
| 325 | }); | 325 | }); |
| 326 | | 326 | |
| 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(); | | |
| 332 | | 331 | |
| 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; |
| 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) { | 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 | }; |
| 347 | | 355 | |
| 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 | } |
| 374 | | 382 | |
| 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 | } |
| 379 | | 389 | |
| | 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; |