mirror of https://github.com/python/cpython
46 lines
1.9 KiB
Plaintext
46 lines
1.9 KiB
Plaintext
#######################################
|
|
# C Globals and CPython Runtime State.
|
|
|
|
CPython's C code makes extensive use of global variables. Each global
|
|
falls into one of several categories:
|
|
|
|
* (effectively) constants (incl. static types)
|
|
* globals used exclusively in main or in the REPL
|
|
* freelists, caches, and counters
|
|
* process-global state
|
|
* module state
|
|
* Python runtime state
|
|
|
|
The ignored-globals.txt file is organized similarly. Of the different
|
|
categories, the last two are problematic and generally should not exist
|
|
in the codebase.
|
|
|
|
Globals that hold module state (i.e. in Modules/*.c) cause problems
|
|
when multiple interpreters are in use. For more info, see PEP 3121,
|
|
which addresses the situation for extension modules in general.
|
|
|
|
Globals in the last category should be avoided as well. The problem
|
|
isn't with the Python runtime having state. Rather, the problem is with
|
|
that state being spread throughout the codebase in dozens of individual
|
|
globals. Unlike the other globals, the runtime state represents a set
|
|
of values that are constantly shifting in a complex way. When they are
|
|
spread out it's harder to get a clear picture of what the runtime
|
|
involves. Furthermore, when they are spread out it complicates efforts
|
|
that change the runtime.
|
|
|
|
Consequently, the globals for Python's runtime state have been
|
|
consolidated under a single top-level _PyRuntime global. No new globals
|
|
should be added for runtime state. Instead, they should be added to
|
|
_PyRuntimeState or one of its sub-structs. The check-c-globals script
|
|
should be run to ensure that no new globals have been added:
|
|
|
|
python3 Tools/c-analyzer/check-c-globals.py
|
|
|
|
You can also use the more generic tool:
|
|
|
|
python3 Tools/c-analyzer/c-analyzer.py
|
|
|
|
If it reports any globals then they should be resolved. If the globals
|
|
are runtime state then they should be folded into _PyRuntimeState.
|
|
Otherwise they should be added to ignored-globals.txt.
|