std.Build.Step.Compile: fix race condition in args file creation #23997
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #23993
Previously, if multiple build processes tried to create the same args file, there was a race condition with the use of the non-atomic
writeFile
function which could cause a spawned compiler to read an empty or incomplete args file. This commit avoids the race condition by first writing to a temporary file with a random path and renaming it to the desired path.This follows the same strategy as the package fetching code, including the convention of
tmp/<random u64 hex>
as the temporary file name.I tested this with the original reproducer from the linked issue, and I'm no longer seeing any errors with this change applied. I also tested it with the
.zig-cache
directory deleted, to make sure it works properly on the first run, before the args file is created.