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_works
inset_inheritable
function is a static variable which has three possible values:ioctl
cannot be used for this functionality;fcntl
is used as a fallback.ioctl
works in the current environment, and we should continue to use it.When it is
0
, usingioctl
as a fast path will always be skipped.When it is
-1
or1
,ioctl
will be used as a fast path to perform the functionality, and it will be set to0
or1
based on the result of whetherioctl
raises an error or not. And ifioctl
failed, usefnctl
as a slow path fallback.Following this logic, it is safe to call
set_inheritable
with 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.