diff --git a/lib/std/Build/Step.zig b/lib/std/Build/Step.zig index bacc81cbfa..e2c51cc6fe 100644 --- a/lib/std/Build/Step.zig +++ b/lib/std/Build/Step.zig @@ -542,6 +542,7 @@ fn zigProcessUpdate(s: *Step, zp: *ZigProcess, watch: bool, web_server: ?*Build. const stdout = &stdout_reader.interface; var body_buffer: std.ArrayList(u8) = .empty; + defer body_buffer.deinit(gpa); while (true) { const Header = std.zig.Server.Message.Header; diff --git a/lib/std/Build/WebServer.zig b/lib/std/Build/WebServer.zig index e1536fb8fa..1f380b6c50 100644 --- a/lib/std/Build/WebServer.zig +++ b/lib/std/Build/WebServer.zig @@ -588,11 +588,12 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim }); defer child.kill(io); - var poller = Io.poll(gpa, enum { stdout, stderr }, .{ - .stdout = child.stdout.?, - .stderr = child.stderr.?, - }); - defer poller.deinit(); + var stderr_task = try io.concurrent(readStreamAlloc, .{ gpa, io, child.stderr.?, .unlimited }); + defer if (stderr_task.cancel(io)) |slice| gpa.free(slice) else |_| {}; + + var stdout_buffer: [512]u8 = undefined; + var stdout_reader: Io.File.Reader = .initStreaming(child.stdout.?, io, &stdout_buffer); + const stdout = &stdout_reader.interface; try child.stdin.?.writeStreamingAll(io, @ptrCast(@as([]const std.zig.Client.Message.Header, &.{ .{ .tag = .update, .bytes_len = 0 }, @@ -600,16 +601,17 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim }))); const Header = std.zig.Server.Message.Header; + var result: ?Cache.Path = null; var result_error_bundle = std.zig.ErrorBundle.empty; + var body_buffer: std.ArrayList(u8) = .empty; + defer body_buffer.deinit(gpa); - const stdout = poller.reader(.stdout); - - poll: while (true) { - 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; + while (true) { + const header = try stdout.takeStruct(Header, .little); + body_buffer.clearRetainingCapacity(); + try stdout.appendExact(gpa, &body_buffer, header.bytes_len); + const body = body_buffer.items; switch (header.tag) { .zig_version => { @@ -636,7 +638,7 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim } } - const stderr_contents = try poller.toOwnedSlice(.stderr); + const stderr_contents = try stderr_task.await(io); if (stderr_contents.len > 0) { std.debug.print("{s}", .{stderr_contents}); } @@ -697,6 +699,14 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim return base_path.join(arena, bin_name); } +fn readStreamAlloc(gpa: Allocator, io: Io, file: Io.File, limit: Io.Limit) ![]u8 { + var file_reader: Io.File.Reader = .initStreaming(file, io, &.{}); + return file_reader.interface.allocRemaining(gpa, limit) catch |err| switch (err) { + error.ReadFailed => return file_reader.err.?, + else => |e| return e, + }; +} + pub fn updateTimeReportCompile(ws: *WebServer, opts: struct { compile: *Build.Step.Compile,