summaryrefslogtreecommitdiffstats
path: root/Doc/c-api
diff options
context:
space:
mode:
authorBrett Simmers <swtaarrs@users.noreply.github.com>2024-05-03 15:30:55 (GMT)
committerGitHub <noreply@github.com>2024-05-03 15:30:55 (GMT)
commitc2627d6eea924daf80f374c18a5fd73ef61283fa (patch)
tree91d94d70f490562b2773aadb49b8befee6354f75 /Doc/c-api
parent3e818afb9b7c557aa633aeb3d5c4959750feeab0 (diff)
downloadcpython-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.rst38
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
^^^^^^^^^^^^^