gh-117657: Fix data races for set_inheritable in fileutils.c with free-threaded builds #120458
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.
ioctl_worksinset_inheritablefunction is a static variable which has three possible values:ioctlcannot be used for this functionality;fcntlis used as a fallback.ioctlworks in the current environment, and we should continue to use it.When it is
0, usingioctlas a fast path will always be skipped.When it is
-1or1,ioctlwill be used as a fast path to perform the functionality, and it will be set to0or1based on the result of whetherioctlraises an error or not. And ifioctlfailed, usefnctlas a slow path fallback.Following this logic, it is safe to call
set_inheritablewith multiple threads in a free-threaded build. The fast path can be safely used even if it leads to failure. Therefore, we can simply use atomic operations to read or writeioctl_works's value to resolve data races.