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....@@ -542,6 +542,7 @@ fn zigProcessUpdate(s: *Step, zp: *ZigProcess, watch: bool, web_server: ?*Build.
542 const stdout = &stdout_reader.interface;542 const stdout = &stdout_reader.interface;
543543
544 var body_buffer: std.ArrayList(u8) = .empty;544 var body_buffer: std.ArrayList(u8) = .empty;
545 defer body_buffer.deinit(gpa);
545546
546 while (true) {547 while (true) {
547 const Header = std.zig.Server.Message.Header;548 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...@@ -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);
590590
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;
596597
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 })));
601602
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);
605609
606 const stdout = poller.reader(.stdout);610 while (true) {
607611 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;
613615
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 }
638640
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}
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
700pub fn updateTimeReportCompile(ws: *WebServer, opts: struct {710pub fn updateTimeReportCompile(ws: *WebServer, opts: struct {
701 compile: *Build.Step.Compile,711 compile: *Build.Step.Compile,
702712