| ... | @@ -588,11 +588,12 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim | ... | @@ -588,11 +588,12 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim |
| 588 | }); | 588 | }); |
| 589 | defer child.kill(io); | 589 | defer child.kill(io); |
| 590 | | 590 | |
| 591 | var poller = Io.poll(gpa, enum { stdout, stderr }, .{ | 591 | var stderr_task = try io.concurrent(readStreamAlloc, .{ gpa, io, child.stderr.?, .unlimited }); |
| 592 | .stdout = child.stdout.?, | 592 | defer if (stderr_task.cancel(io)) |slice| gpa.free(slice) else |_| {}; |
| 593 | .stderr = child.stderr.?, | 593 | |
| 594 | }); | 594 | var stdout_buffer: [512]u8 = undefined; |
| 595 | defer poller.deinit(); | 595 | var stdout_reader: Io.File.Reader = .initStreaming(child.stdout.?, io, &stdout_buffer); |
| | 596 | const stdout = &stdout_reader.interface; |
| 596 | | 597 | |
| 597 | try child.stdin.?.writeStreamingAll(io, @ptrCast(@as([]const std.zig.Client.Message.Header, &.{ | 598 | try child.stdin.?.writeStreamingAll(io, @ptrCast(@as([]const std.zig.Client.Message.Header, &.{ |
| 598 | .{ .tag = .update, .bytes_len = 0 }, | 599 | .{ .tag = .update, .bytes_len = 0 }, |
| ... | @@ -600,16 +601,17 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim | ... | @@ -600,16 +601,17 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim |
| 600 | }))); | 601 | }))); |
| 601 | | 602 | |
| 602 | const Header = std.zig.Server.Message.Header; | 603 | const Header = std.zig.Server.Message.Header; |
| | 604 | |
| 603 | var result: ?Cache.Path = null; | 605 | var result: ?Cache.Path = null; |
| 604 | var result_error_bundle = std.zig.ErrorBundle.empty; | 606 | var result_error_bundle = std.zig.ErrorBundle.empty; |
| | 607 | var body_buffer: std.ArrayList(u8) = .empty; |
| | 608 | defer body_buffer.deinit(gpa); |
| 605 | | 609 | |
| 606 | const stdout = poller.reader(.stdout); | 610 | while (true) { |
| 607 | | 611 | const header = try stdout.takeStruct(Header, .little); |
| 608 | poll: while (true) { | 612 | body_buffer.clearRetainingCapacity(); |
| 609 | while (stdout.buffered().len < @sizeOf(Header)) if (!(try poller.poll())) break :poll; | 613 | try stdout.appendExact(gpa, &body_buffer, header.bytes_len); |
| 610 | const header = stdout.takeStruct(Header, .little) catch unreachable; | 614 | const body = body_buffer.items; |
| 611 | while (stdout.buffered().len < header.bytes_len) if (!try poller.poll()) break :poll; | | |
| 612 | const body = stdout.take(header.bytes_len) catch unreachable; | | |
| 613 | | 615 | |
| 614 | switch (header.tag) { | 616 | switch (header.tag) { |
| 615 | .zig_version => { | 617 | .zig_version => { |
| ... | @@ -636,7 +638,7 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim | ... | @@ -636,7 +638,7 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim |
| 636 | } | 638 | } |
| 637 | } | 639 | } |
| 638 | | 640 | |
| 639 | const stderr_contents = try poller.toOwnedSlice(.stderr); | 641 | const stderr_contents = try stderr_task.await(io); |
| 640 | if (stderr_contents.len > 0) { | 642 | if (stderr_contents.len > 0) { |
| 641 | std.debug.print("{s}", .{stderr_contents}); | 643 | std.debug.print("{s}", .{stderr_contents}); |
| 642 | } | 644 | } |
| ... | @@ -697,6 +699,14 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim | ... | @@ -697,6 +699,14 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim |
| 697 | return base_path.join(arena, bin_name); | 699 | return base_path.join(arena, bin_name); |
| 698 | } | 700 | } |
| 699 | | 701 | |
| | 702 | fn readStreamAlloc(gpa: Allocator, io: Io, file: Io.File, limit: Io.Limit) ![]u8 { |
| | 703 | var file_reader: Io.File.Reader = .initStreaming(file, io, &.{}); |
| | 704 | return file_reader.interface.allocRemaining(gpa, limit) catch |err| switch (err) { |
| | 705 | error.ReadFailed => return file_reader.err.?, |
| | 706 | else => |e| return e, |
| | 707 | }; |
| | 708 | } |
| | 709 | |
| 700 | pub fn updateTimeReportCompile(ws: *WebServer, opts: struct { | 710 | pub fn updateTimeReportCompile(ws: *WebServer, opts: struct { |
| 701 | compile: *Build.Step.Compile, | 711 | compile: *Build.Step.Compile, |
| 702 | | 712 | |