Build.WebServer: update concurrency API usage

This commit is contained in:
Andrew Kelley
2026-01-12 17:41:08 -08:00
parent 8146ccfecc
commit 78a1476475
2 changed files with 24 additions and 13 deletions
+1
View File
@@ -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;
+23 -13
View File
@@ -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,