#else
#if defined(HAVE_SYS_IOCTL_H) && defined(FIOCLEX) && defined(FIONCLEX)
- if (ioctl_works != 0 && raise != 0) {
+ if (raise != 0 && _Py_atomic_load_int_relaxed(&ioctl_works) != 0) {
/* fast-path: ioctl() only requires one syscall */
/* caveat: raise=0 is an indicator that we must be async-signal-safe
* thus avoid using ioctl() so we skip the fast-path. */
request = FIOCLEX;
err = ioctl(fd, request, NULL);
if (!err) {
- ioctl_works = 1;
+ if (_Py_atomic_load_int_relaxed(&ioctl_works) == -1) {
+ _Py_atomic_store_int_relaxed(&ioctl_works, 1);
+ }
return 0;
}
with EACCES. While FIOCLEX is safe operation it may be
unavailable because ioctl was denied altogether.
This can be the case on Android. */
- ioctl_works = 0;
+ _Py_atomic_store_int_relaxed(&ioctl_works, 0);
}
/* fallback to fcntl() if ioctl() does not work */
}
race_top:set_contains_key
# https://gist.github.com/colesbury/d13d033f413b4ad07929d044bed86c35
race_top:set_discard_entry
-race_top:set_inheritable
race_top:_PyDict_CheckConsistency
race_top:_Py_dict_lookup_threadsafe
race_top:_multiprocessing_SemLock_acquire_impl