authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-12 17:41:08-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-30 12:10:01-08:00
log50db074bdf7b7ee5feaa650f2a0efc21b90ab589
tree0a21437704dc020c7df4396d4105595649e4db73
parentdea653fdb97c62968138c28496f25510b5d50024

Build.WebServer: update concurrency API usage


2 files changed, 24 insertions(+), 13 deletions(-)

lib/std/Build/Step.zig+1
......@@ -542,6 +542,7 @@ fn zigProcessUpdate(s: *Step, zp: *ZigProcess, watch: bool, web_server: ?*Build.
542542 const stdout = &stdout_reader.interface;
543543
544544 var body_buffer: std.ArrayList(u8) = .empty;
545 defer body_buffer.deinit(gpa);
545546
546547 while (true) {
547548 const Header = std.zig.Server.Message.Header;
lib/std/Build/WebServer.zig+23-13
......@@ -588,11 +588,12 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim
588588 });
589589 defer child.kill(io);
590590
591 var poller = Io.poll(gpa, enum { stdout, stderr }, .{
592 .stdout = child.stdout.?,
593 .stderr = child.stderr.?,
594 });
595 defer poller.deinit();
591 var stderr_task = try io.concurrent(readStreamAlloc, .{ gpa, io, child.stderr.?, .unlimited });
592 defer if (stderr_task.cancel(io)) |slice| gpa.free(slice) else |_| {};
593
594 var stdout_buffer: [512]u8 = undefined;
595 var stdout_reader: Io.File.Reader = .initStreaming(child.stdout.?, io, &stdout_buffer);
596 const stdout = &stdout_reader.interface;
596597
597598 try child.stdin.?.writeStreamingAll(io, @ptrCast(@as([]const std.zig.Client.Message.Header, &.{
598599 .{ .tag = .update, .bytes_len = 0 },
......@@ -600,16 +601,17 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim
600601 })));
601602
602603 const Header = std.zig.Server.Message.Header;
604
603605 var result: ?Cache.Path = null;
604606 var result_error_bundle = std.zig.ErrorBundle.empty;
607 var body_buffer: std.ArrayList(u8) = .empty;
608 defer body_buffer.deinit(gpa);
605609
606 const stdout = poller.reader(.stdout);
607
608 poll: while (true) {
609 while (stdout.buffered().len < @sizeOf(Header)) if (!(try poller.poll())) break :poll;
610 const header = stdout.takeStruct(Header, .little) catch unreachable;
611 while (stdout.buffered().len < header.bytes_len) if (!try poller.poll()) break :poll;
612 const body = stdout.take(header.bytes_len) catch unreachable;
610 while (true) {
611 const header = try stdout.takeStruct(Header, .little);
612 body_buffer.clearRetainingCapacity();
613 try stdout.appendExact(gpa, &body_buffer, header.bytes_len);
614 const body = body_buffer.items;
613615
614616 switch (header.tag) {
615617 .zig_version => {
......@@ -636,7 +638,7 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim
636638 }
637639 }
638640
639 const stderr_contents = try poller.toOwnedSlice(.stderr);
641 const stderr_contents = try stderr_task.await(io);
640642 if (stderr_contents.len > 0) {
641643 std.debug.print("{s}", .{stderr_contents});
642644 }
......@@ -697,6 +699,14 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim
697699 return base_path.join(arena, bin_name);
698700}
699701
702fn 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
700710pub fn updateTimeReportCompile(ws: *WebServer, opts: struct {
701711 compile: *Build.Step.Compile,
702712