diff options
author | Brett Simmers <swtaarrs@users.noreply.github.com> | 2024-05-03 15:30:55 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-03 15:30:55 (GMT) |
commit | c2627d6eea924daf80f374c18a5fd73ef61283fa (patch) | |
tree | 91d94d70f490562b2773aadb49b8befee6354f75 /Doc/c-api | |
parent | 3e818afb9b7c557aa633aeb3d5c4959750feeab0 (diff) | |
download | cpython-c2627d6eea924daf80f374c18a5fd73ef61283fa.zip cpython-c2627d6eea924daf80f374c18a5fd73ef61283fa.tar.gz cpython-c2627d6eea924daf80f374c18a5fd73ef61283fa.tar.bz2 |
gh-116322: Add Py_mod_gil module slot (#116882)
This PR adds the ability to enable the GIL if it was disabled at
interpreter startup, and modifies the multi-phase module initialization
path to enable the GIL when loading a module, unless that module's spec
includes a slot indicating it can run safely without the GIL.
PEP 703 called the constant for the slot `Py_mod_gil_not_used`; I went
with `Py_MOD_GIL_NOT_USED` for consistency with gh-104148.
A warning will be issued up to once per interpreter for the first
GIL-using module that is loaded. If `-v` is given, a shorter message
will be printed to stderr every time a GIL-using module is loaded
(including the first one that issues a warning).
Diffstat (limited to 'Doc/c-api')
-rw-r--r-- | Doc/c-api/module.rst | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index 979b222..86308d9 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -411,6 +411,31 @@ The available slot types are: .. versionadded:: 3.12 +.. c:macro:: Py_mod_gil + + Specifies one of the following values: + + .. c:macro:: Py_MOD_GIL_USED + + The module depends on the presence of the global interpreter lock (GIL), + and may access global state without synchronization. + + .. c:macro:: Py_MOD_GIL_NOT_USED + + The module is safe to run without an active GIL. + + This slot is ignored by Python builds not configured with + :option:`--disable-gil`. Otherwise, it determines whether or not importing + this module will cause the GIL to be automatically enabled. See + :envvar:`PYTHON_GIL` and :option:`-X gil <-X>` for more detail. + + Multiple ``Py_mod_gil`` slots may not be specified in one module definition. + + If ``Py_mod_gil`` is not specified, the import machinery defaults to + ``Py_MOD_GIL_USED``. + + .. versionadded: 3.13 + See :PEP:`489` for more details on multi-phase initialization. Low-level module creation functions @@ -609,6 +634,19 @@ state: .. versionadded:: 3.9 +.. c:function:: int PyModule_ExperimentalSetGIL(PyObject *module, void *gil) + + Indicate that *module* does or does not support running without the global + interpreter lock (GIL), using one of the values from + :c:macro:`Py_mod_gil`. It must be called during *module*'s initialization + function. If this function is not called during module initialization, the + import machinery assumes the module does not support running without the + GIL. This function is only available in Python builds configured with + :option:`--disable-gil`. + Return ``-1`` on error, ``0`` on success. + + .. versionadded:: 3.13 + Module lookup ^^^^^^^^^^^^^ |