Commit 4918c2ce2d

Andrew Kelley <andrew@ziglang.org>
2024-05-31 21:39:08
std.Build.Step.Run: global lock when child inherits stderr
The docs for setting stdio to "inherit" say: It also means that this step will obtain a global lock to prevent other steps from running in the meantime. The implementation of this lock was missing but is now provided by this commit. closes #20119
1 parent c564a16
Changed files (1)
lib
std
Build
Step
lib/std/Build/Step/Run.zig
@@ -1241,20 +1241,26 @@ fn spawnChildAndCollect(
         child.stdin_behavior = .Pipe;
     }
 
-    if (run.stdio != .zig_test and !run.disable_zig_progress) {
+    const inherit = child.stdout_behavior == .Inherit or child.stderr_behavior == .Inherit;
+
+    if (run.stdio != .zig_test and !run.disable_zig_progress and !inherit) {
         child.progress_node = prog_node;
     }
 
-    try child.spawn();
-    var timer = try std.time.Timer.start();
+    const term, const result, const elapsed_ns = t: {
+        if (inherit) std.debug.lockStdErr();
+        defer if (inherit) std.debug.unlockStdErr();
 
-    const result = if (run.stdio == .zig_test)
-        evalZigTest(run, &child, prog_node)
-    else
-        evalGeneric(run, &child);
+        try child.spawn();
+        var timer = try std.time.Timer.start();
 
-    const term = try child.wait();
-    const elapsed_ns = timer.read();
+        const result = if (run.stdio == .zig_test)
+            evalZigTest(run, &child, prog_node)
+        else
+            evalGeneric(run, &child);
+
+        break :t .{ try child.wait(), result, timer.read() };
+    };
 
     return .{
         .stdio = try result,