cpython/Python
Gregory P. Smith 64afa947f4
gh-146302: make Py_IsInitialized() thread-safe and reflect true init completion (GH-146303)
## Summary

- Move the `runtime->initialized = 1` store from before `site.py` import to the end of `init_interp_main()`, so `Py_IsInitialized()` only returns true after initialization has fully completed
- Access `initialized` and `core_initialized` through new inline accessors using acquire/release atomics, to also protect from data race undefined behavior
- `PySys_AddAuditHook()` now uses the accessor, so with the flag move it correctly skips audit hook invocation during all init phases (matching the documented "after runtime initialization" behavior) ... We could argue that running these earlier would be good even if the intent was never explicitly expressed, but that'd be its own issue.

## Motivation

`Py_IsInitialized()` returned 1 while `Py_InitializeEx()` was still running — specifically, before `site.py` had been imported. See https://github.com/PyO3/pyo3/issues/5900 where a second thread could acquire the GIL and start executing Python with an incomplete `sys.path` because `site.py` hadn't finished.

The flag was also a plain `int` with no atomic operations, making concurrent reads a C-standard data race, though unlikely to manifest.

## Regression test:

The added test properly fails on `main` with `ERROR: Py_IsInitialized() was true during site import`.

---

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:54:23 +00:00
..
clinic gh-148110: Resolve lazy import filter names for relative imports (#148111) 2026-04-06 22:29:02 +01:00
frozen_modules gh-97669: Create Tools/build/ directory (#97963) 2022-10-17 12:01:00 +02:00
_contextvars.c gh-128341: Use _Py_ABI_SLOT in stdlib modules (#145770) 2026-03-24 17:47:55 +00:00
_warnings.c gh-128341: Use _Py_ABI_SLOT in stdlib modules (#145770) 2026-03-24 17:47:55 +00:00
asdl.c
asm_trampoline.S gh-136459: Add perf trampoline support for macOS (#136461) 2025-07-22 16:47:24 +01:00
assemble.c gh-146442: Fix various bugs in compiler pipeline (#146443) 2026-03-30 22:04:04 +02:00
ast.c gh-143055: Implementation of PEP 798 (#143056) 2026-01-30 20:37:52 -08:00
ast_preprocess.c gh-143055: Implementation of PEP 798 (#143056) 2026-01-30 20:37:52 -08:00
ast_unparse.c gh-143055: Fix crash in AST unparser when unparsing dict comprehension unpacking (#145556) 2026-03-09 10:37:23 -07:00
bltinmodule.c gh-146615: Fix format specifiers in Python/ directory (GH-146619) 2026-03-31 10:59:17 +03:00
bootstrap_hash.c GH-131238: Core header refactor (GH-131250) 2025-03-17 09:19:04 +00:00
brc.c Fix typos in documentation and comments (#119763) 2024-06-04 10:22:22 +00:00
bytecodes.c gh-148276: Optimize object creation and method calls in the JIT by resolving __init__ at trace optimization time (GH-148277) 2026-04-11 22:22:42 +08:00
ceval.c gh-148171: Convert CALL_BUILTIN_CLASS to leave arguments on the stack (gh-148381) 2026-04-11 23:01:25 +09:00
ceval.h gh-142349: Implement PEP 810 - Explicit lazy imports (#142351) 2026-02-12 00:15:33 +00:00
ceval_gil.c gh-144748: Make PyErr_CheckSignals raise the exception scheduled by PyThreadState_SetAsyncExc (GH-145178) 2026-03-02 11:47:32 +01:00
ceval_macros.h gh-146640: Optimize int operations by mutating uniquely-referenced operands in place (JIT only) (GH-146641) 2026-04-03 23:23:04 +08:00
codecs.c Python/codecs.c: Remove unused forward declaration (#139511) 2025-10-03 13:33:49 +02:00
codegen.c gh-146442: Fix various bugs in compiler pipeline (#146443) 2026-03-30 22:04:04 +02:00
compile.c gh-146442: Fix various bugs in compiler pipeline (#146443) 2026-03-30 22:04:04 +02:00
condvar.h gh-104530: Enable native Win32 condition variables by default (GH-104531) 2024-02-02 13:50:51 +00:00
config_common.h gh-76785: Add PyInterpreterConfig Helpers (gh-117170) 2024-04-02 20:35:52 +00:00
context.c gh-116738: make entering of contextvars.Context thread safe (#143074) 2026-01-06 12:24:02 +05:30
critical_section.c gh-144513: Skip critical section locking during stop-the-world (gh-144524) 2026-02-06 15:14:08 +00:00
crossinterp.c gh-148072: Cache pickle.dumps/loads per interpreter in XIData (GH-148125) 2026-04-06 11:37:02 -04:00
crossinterp_data_lookup.h gh-147960: Fix memory leak in crossinterp _tuple_shared() on alloc failure (#147961) 2026-04-01 18:34:55 +02:00
crossinterp_exceptions.h gh-132775: Clean Up Cross-Interpreter Error Handling (gh-135369) 2025-06-13 16:45:21 -06:00
dtoa.c gh-145633: Remove support for ancient ARM platforms with mixed-endian doubles (#145634) 2026-03-11 12:39:24 +01:00
dup2.c gh-108765: Python.h no longer includes <unistd.h> (#108783) 2023-09-02 16:50:18 +02:00
dynamic_annotations.c
dynload_hpux.c gh-88402: Add new sysconfig variables on Windows (GH-110049) 2023-10-04 22:50:29 +00:00
dynload_shlib.c gh-146636: PEP 803: add Py_TARGET_ABI3T and .abi3t.so extension (GH-146637) 2026-04-01 16:14:59 +02:00
dynload_stub.c gh-88402: Add new sysconfig variables on Windows (GH-110049) 2023-10-04 22:50:29 +00:00
dynload_win.c gh-131942: Use the Python-specific Py_DEBUG macro rather than _DEBUG in Windows-related C code (GH-131944) 2025-05-08 15:01:25 +00:00
emscripten_signal.c GH-108614: Unbreak emscripten build (GH-109132) 2023-09-08 17:54:45 +01:00
emscripten_syscalls.c gh-124621: Emscripten: Fix __syscall_ioctl patch (GH-136993) 2025-07-22 15:05:26 +02:00
emscripten_trampoline.c gh-145037: Fix Emscripten trampoline with emcc >= 4.0.19 (#145038) 2026-02-26 06:21:05 +08:00
emscripten_trampoline_inner.c gh-128627: Use __builtin_wasm_test_function_pointer_signature for Emscripten trampoline (#137470) 2025-09-17 15:33:55 +01:00
errors.c gh-146480: Override the exception in _PyErr_SetKeyError() (#146486) 2026-03-27 11:20:19 +00:00
executor_cases.c.h gh-148171: Convert CALL_BUILTIN_CLASS to leave arguments on the stack (gh-148381) 2026-04-11 23:01:25 +09:00
fileutils.c gh-42400: Fix buffer overflow in _Py_wrealpath() for very long paths (#141529) 2025-11-18 17:34:58 +01:00
flowgraph.c gh-126835: Fix _PY_IS_SMALL_INT() macro (#146631) 2026-03-30 12:48:18 +00:00
frame.c gh-144446: Fix some frame object thread-safety issues (gh-144479) 2026-02-06 09:43:36 -05:00
frozen.c gh-145278: Revert "freeze encodings (partially) and linecache (#145279)" (#145689) 2026-03-09 18:18:14 +00:00
frozenmain.c Use PyConfig_Get() in frozenmain.c (#137421) 2025-08-06 14:33:28 +02:00
future.c gh-126139: Improve error message location for future statement with unknown feature (#126140) 2024-10-29 23:57:59 +00:00
gc.c gh-146527: Heap-allocate gc_stats to avoid bloating PyInterpreterState (#148057) 2026-04-04 18:42:30 +01:00
gc_free_threading.c gh-146527: Heap-allocate gc_stats to avoid bloating PyInterpreterState (#148057) 2026-04-04 18:42:30 +01:00
gc_gil.c gh-100240: Use a consistent implementation for freelists (#121934) 2024-07-22 12:08:27 -04:00
generated_cases.c.h gh-148171: Convert CALL_BUILTIN_CLASS to leave arguments on the stack (gh-148381) 2026-04-11 23:01:25 +09:00
getargs.c gh-146615: Fix format specifiers in Python/ directory (GH-146619) 2026-03-31 10:59:17 +03:00
getcompiler.c gh-141341: Rename COMPILER macro to _Py_COMPILER on Windows (#141342) 2025-11-10 15:50:51 +01:00
getcopyright.c gh-126133: Only use start year in PSF copyright, remove end years (#126236) 2024-11-12 15:59:19 +02:00
getopt.c GH-133336: Remove reserved `-J` flag for Jython (#133444) 2025-05-05 15:09:19 +00:00
getplatform.c
getversion.c gh-119132: Remove "experimental" tag from the CPython free-threading. (gh-135550) 2025-06-16 23:32:52 +09:00
hamt.c GH-145247: Use _PyTuple_FromPair in Parser and Python (#145842) 2026-03-11 21:08:18 +00:00
hashtable.c gh-111545: Add Py_HashPointer() function (#112096) 2023-12-06 15:09:22 +01:00
import.c gh-148110: Resolve lazy import filter names for relative imports (#148111) 2026-04-06 22:29:02 +01:00
importdl.c gh-140011: Delete importdl assertion that prevents importing embedded modules from packages (GH-141605) 2025-11-26 14:12:49 +01:00
index_pool.c gh-91048: Refactor and optimize remote debugging module (#134652) 2025-05-25 20:19:29 +00:00
initconfig.c gh-146244: Fix initconfig.c SET_ITEM macro leaks dict on expression failure (GH-146246) 2026-03-25 19:09:56 +00:00
instruction_sequence.c GH-143493: Conform to spec for generator expressions while supporting virtual iterators (GH-143569) 2026-01-16 09:11:58 +00:00
instrumentation.c gh-148037: remove critical section from PyCode_Addr2Line (#148103) 2026-04-10 17:58:17 +05:30
interpconfig.c gh-146615: Fix format specifiers in Python/ directory (GH-146619) 2026-03-31 10:59:17 +03:00
intrinsics.c gh-111489: Remove _PyTuple_FromArray() alias (#139973) 2025-10-11 22:58:14 +02:00
jit.c GH-146128: Remove the buggy AArch64 "33rx" relocation (#146263) 2026-04-07 07:52:59 +03:00
legacy_tracing.c gh-148037: remove critical section from PyCode_Addr2Line (#148103) 2026-04-10 17:58:17 +05:30
lock.c gh-135871: Reload lock internal state while spinning in PyMutex_LockTimed (gh-146064) 2026-03-23 16:55:06 -04:00
marshal.c gh-128341: Use _Py_ABI_SLOT in stdlib modules (#145770) 2026-03-24 17:47:55 +00:00
modsupport.c gh-146636: Py_mod_abi mandatory for modules created from slots array (GH-146855) 2026-04-02 13:54:21 +02:00
mysnprintf.c Add a warning message about PyOS_snprintf (#95993) 2022-10-07 11:49:53 -07:00
mystrtoul.c gh-108765: Python.h no longer includes <ctype.h> (#108831) 2023-09-03 18:54:27 +02:00
object_stack.c gh-100240: Use a consistent implementation for freelists (#121934) 2024-07-22 12:08:27 -04:00
opcode_targets.h GH-145667: Merge GET_ITER and GET_YIELD_FROM_ITER (GH-146120) 2026-03-21 10:48:13 +00:00
optimizer.c gh-146073: Revert "gh-146073: Add fitness/exit quality mechanism for JIT trace frontend (GH-147966)" (#148082) 2026-04-04 11:56:40 +00:00
optimizer_analysis.c gh-131798: do not watch immutable types in JIT (#148383) 2026-04-11 15:43:53 +00:00
optimizer_bytecodes.c gh-131798: do not watch immutable types in JIT (#148383) 2026-04-11 15:43:53 +00:00
optimizer_cases.c.h gh-131798: do not watch immutable types in JIT (#148383) 2026-04-11 15:43:53 +00:00
optimizer_symbols.c gh-148374: Fix a bug in _Py_uop_sym_get_type (GH-148375) 2026-04-11 23:03:13 +08:00
parking_lot.c gh-137433: Fix deadlock with stop-the-world and daemon threads (gh-137735) 2025-09-16 09:21:58 +01:00
pathconfig.c gh-133644: Remove deprecated Python initialization getter functions (#133661) 2025-05-09 11:39:23 +00:00
perf_jit_trampoline.c gh-144194: Fix mmap failure check in perf_jit_trampoline.c (#143713) 2026-01-28 13:30:17 +00:00
perf_trampoline.c gh-144766: Fix a crash in fork child process when perf support is enabled. (#144795) 2026-02-14 11:41:28 +00:00
preconfig.c gh-146302: make Py_IsInitialized() thread-safe and reflect true init completion (GH-146303) 2026-04-11 21:54:23 +00:00
pyarena.c Chore: Fix typo in pyarena.c (#126527) 2024-11-07 16:37:41 +01:00
pyctype.c
pyfpe.c bpo-46315: Add ifdef HAVE_ feature checks for WASI compatibility (GH-30507) 2022-01-13 09:46:04 +01:00
pyhash.c gh-141226: Deprecate PEP-456 support for embedders (#141287) 2026-02-21 12:42:13 +01:00
pylifecycle.c gh-146302: make Py_IsInitialized() thread-safe and reflect true init completion (GH-146303) 2026-04-11 21:54:23 +00:00
pymath.c
pystate.c gh-146302: make Py_IsInitialized() thread-safe and reflect true init completion (GH-146303) 2026-04-11 21:54:23 +00:00
pystats.c gh-146073: Revert "gh-146073: Add fitness/exit quality mechanism for JIT trace frontend (GH-147966)" (#148082) 2026-04-04 11:56:40 +00:00
pystrcmp.c gh-108767: Replace ctype.h functions with pyctype.h functions (#108772) 2023-09-01 18:36:53 +02:00
pystrhex.c gh-147944: Increase range of bytes_per_sep (GH-147946) 2026-04-01 08:33:30 +00:00
pystrtod.c gh-141004: soft-deprecate Py_INFINITY macro (#141033) 2025-11-12 13:44:49 +01:00
Python-ast.c gh-128341: Use _Py_ABI_SLOT in stdlib modules (#145770) 2026-03-24 17:47:55 +00:00
Python-tokenize.c gh-128341: Use _Py_ABI_SLOT in stdlib modules (#145770) 2026-03-24 17:47:55 +00:00
pythonrun.c gh-146615: Fix format specifiers in Python/ directory (GH-146619) 2026-03-31 10:59:17 +03:00
pytime.c gh-145731: Fix negative timestamp during DST on Windows (GH-145728) 2026-03-10 09:45:07 +01:00
qsbr.c gh-144438: Fix false sharing between QSBR and tlbc_index (gh-144554) 2026-02-17 11:12:25 -05:00
README
record_functions.c.h gh-148276: Optimize object creation and method calls in the JIT by resolving __init__ at trace optimization time (GH-148277) 2026-04-11 22:22:42 +08:00
remote_debug.h gh-144316: Fix missing exception in _remote_debugging with debug=False (#144442) 2026-02-26 21:14:34 +00:00
remote_debugging.c gh-138122: Implement frame caching in RemoteUnwinder to reduce memory reads (#142137) 2025-12-06 22:37:34 +00:00
specialize.c gh-95004: specialize access to enums and fix scaling on free-threading (#148184) 2026-04-07 21:43:50 +05:30
stackrefs.c gh-131527: Stackref debug borrow checker (#140599) 2025-11-05 11:12:56 -08:00
stdlib_module_names.h gh-81313: Add the math.integer module (PEP-791) (GH-133909) 2025-10-31 16:13:43 +02:00
structmember.c gh-41779: Allow defining any __slots__ for a class derived from tuple (GH-141763) 2026-01-06 11:36:00 +02:00
suggestions.c GH-131238: Core header refactor (GH-131250) 2025-03-17 09:19:04 +00:00
symtable.c gh-145701: Fix __classdict__ & __conditional_annotations__ in class-scope inlined comprehensions (GH-145702) 2026-03-09 12:56:41 -07:00
sysmodule.c gh-146302: make Py_IsInitialized() thread-safe and reflect true init completion (GH-146303) 2026-04-11 21:54:23 +00:00
thread.c gh-134745: Use "pymutex" for sys.thread_info on Windows (#141140) 2025-11-06 16:10:39 +01:00
thread_nt.h gh-134745: Change PyThread_allocate_lock() implementation to PyMutex (#134747) 2025-05-30 10:15:47 +00:00
thread_pthread.h gh-137884: Added threading.get_native_id() on Illumos/Solaris (GH-137927) 2025-08-20 17:10:44 +00:00
thread_pthread_stubs.h gh-125161: return non zero value in pthread_self on wasi (#125303) 2024-10-13 20:59:41 +05:30
tier2_engine.md Docs: fix spelling of the word 'transferring' (#116641) 2024-03-13 23:53:32 +01:00
traceback.c gh-145792: Fix incorrect alloca allocation size in traceback.c (#145814) 2026-03-13 13:15:26 +01:00
tracemalloc.c gh-144763: Don't detach the GIL in tracemalloc (#144779) 2026-02-18 15:57:48 +00:00
uniqueid.c gh-128923: Use zero to indicate unassigned unique id (#128925) 2025-01-17 16:42:27 +01:00
vm-state.md gh-133079: Remove Py_C_RECURSION_LIMIT & PyThreadState.c_recursion_remaining (GH-133080) 2025-04-29 12:56:20 +02:00

Miscellaneous source files for the main Python shared library