authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2026-03-24 06:23:56-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-03-27 03:28:50+01:00
log49a258c0e00d8221d088d283a4bd4fb7b0f6b21f
tree68a9df2ed0f24f77d9cd2fe769eeea647305e35e
parent49fa67d8265acfa0621e88acbad1fa598f128468

std.Build.Step.Run: improve syscalls while running zig test executables

Previously, each message requires an unseekable error to be returned from a syscall before proceeding. Ideally, the code would just pass around `*std.Io.Writer` instead of `std.Io.File` in the first place, but even then, you could argue for saving a syscall with `writerStreaming`.

1 files changed, 4 insertions(+), 4 deletions(-)

lib/std/Build/Step/Run.zig+4-4
...@@ -2126,7 +2126,7 @@ fn sendMessage(io: Io, file: Io.File, tag: std.zig.Client.Message.Tag) !void {...@@ -2126,7 +2126,7 @@ fn sendMessage(io: Io, file: Io.File, tag: std.zig.Client.Message.Tag) !void {
2126 .tag = tag,2126 .tag = tag,
2127 .bytes_len = 0,2127 .bytes_len = 0,
2128 };2128 };
2129 var w = file.writer(io, &.{});2129 var w = file.writerStreaming(io, &.{});
2130 w.interface.writeStruct(header, .little) catch |err| switch (err) {2130 w.interface.writeStruct(header, .little) catch |err| switch (err) {
2131 error.WriteFailed => return w.err.?,2131 error.WriteFailed => return w.err.?,
2132 };2132 };
...@@ -2137,7 +2137,7 @@ fn sendRunTestMessage(io: Io, file: Io.File, tag: std.zig.Client.Message.Tag, in...@@ -2137,7 +2137,7 @@ fn sendRunTestMessage(io: Io, file: Io.File, tag: std.zig.Client.Message.Tag, in
2137 .tag = tag,2137 .tag = tag,
2138 .bytes_len = 4,2138 .bytes_len = 4,
2139 };2139 };
2140 var w = file.writer(io, &.{});2140 var w = file.writerStreaming(io, &.{});
2141 w.interface.writeStruct(header, .little) catch |err| switch (err) {2141 w.interface.writeStruct(header, .little) catch |err| switch (err) {
2142 error.WriteFailed => return w.err.?,2142 error.WriteFailed => return w.err.?,
2143 };2143 };
...@@ -2157,7 +2157,7 @@ fn sendRunFuzzTestMessage(...@@ -2157,7 +2157,7 @@ fn sendRunFuzzTestMessage(
2157 .tag = .start_fuzzing,2157 .tag = .start_fuzzing,
2158 .bytes_len = 4 + 1 + 8,2158 .bytes_len = 4 + 1 + 8,
2159 };2159 };
2160 var w = file.writer(io, &.{});2160 var w = file.writerStreaming(io, &.{});
2161 w.interface.writeStruct(header, .little) catch |err| switch (err) {2161 w.interface.writeStruct(header, .little) catch |err| switch (err) {
2162 error.WriteFailed => return w.err.?,2162 error.WriteFailed => return w.err.?,
2163 };2163 };
...@@ -2202,7 +2202,7 @@ fn evalGeneric(run: *Run, spawn_options: process.SpawnOptions) !EvalGenericResul...@@ -2202,7 +2202,7 @@ fn evalGeneric(run: *Run, spawn_options: process.SpawnOptions) !EvalGenericResul
2202 var read_buffer: [1024]u8 = undefined;2202 var read_buffer: [1024]u8 = undefined;
2203 var file_reader = file.reader(io, &read_buffer);2203 var file_reader = file.reader(io, &read_buffer);
2204 var write_buffer: [1024]u8 = undefined;2204 var write_buffer: [1024]u8 = undefined;
2205 var stdin_writer = child.stdin.?.writer(io, &write_buffer);2205 var stdin_writer = child.stdin.?.writerStreaming(io, &write_buffer);
2206 _ = stdin_writer.interface.sendFileAll(&file_reader, .unlimited) catch |err| switch (err) {2206 _ = stdin_writer.interface.sendFileAll(&file_reader, .unlimited) catch |err| switch (err) {
2207 error.ReadFailed => return run.step.fail("failed to read from {f}: {t}", .{2207 error.ReadFailed => return run.step.fail("failed to read from {f}: {t}", .{
2208 path, file_reader.err.?,2208 path, file_reader.err.?,