summaryrefslogtreecommitdiffstats
path: root/Python
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 /Python
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 'Python')
-rw-r--r--Python/Python-ast.c1
-rw-r--r--Python/Python-tokenize.c1
-rw-r--r--Python/_warnings.c1
-rw-r--r--Python/bltinmodule.c3
-rw-r--r--Python/import.c1
-rw-r--r--Python/marshal.c1
-rw-r--r--Python/sysmodule.c3
7 files changed, 11 insertions, 0 deletions
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index cc7734e..1953142 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -17588,6 +17588,7 @@ astmodule_exec(PyObject *m)
static PyModuleDef_Slot astmodule_slots[] = {
{Py_mod_exec, astmodule_exec},
{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
+ {Py_mod_gil, Py_MOD_GIL_NOT_USED},
{0, NULL}
};
diff --git a/Python/Python-tokenize.c b/Python/Python-tokenize.c
index a789170..41e8107 100644
--- a/Python/Python-tokenize.c
+++ b/Python/Python-tokenize.c
@@ -322,6 +322,7 @@ static PyMethodDef tokenize_methods[] = {
static PyModuleDef_Slot tokenizemodule_slots[] = {
{Py_mod_exec, tokenizemodule_exec},
{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
+ {Py_mod_gil, Py_MOD_GIL_NOT_USED},
{0, NULL}
};
diff --git a/Python/_warnings.c b/Python/_warnings.c
index 2ba704d..793cbc6 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -1498,6 +1498,7 @@ warnings_module_exec(PyObject *module)
static PyModuleDef_Slot warnings_slots[] = {
{Py_mod_exec, warnings_module_exec},
{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
+ {Py_mod_gil, Py_MOD_GIL_NOT_USED},
{0, NULL}
};
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 722353e..88d858d 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -3124,6 +3124,9 @@ _PyBuiltin_Init(PyInterpreterState *interp)
mod = _PyModule_CreateInitialized(&builtinsmodule, PYTHON_API_VERSION);
if (mod == NULL)
return NULL;
+#ifdef Py_GIL_DISABLED
+ PyModule_ExperimentalSetGIL(mod, Py_MOD_GIL_NOT_USED);
+#endif
dict = PyModule_GetDict(mod);
#ifdef Py_TRACE_REFS
diff --git a/Python/import.c b/Python/import.c
index f120a38..4f91f03 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -4212,6 +4212,7 @@ imp_module_exec(PyObject *module)
static PyModuleDef_Slot imp_slots[] = {
{Py_mod_exec, imp_module_exec},
{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
+ {Py_mod_gil, Py_MOD_GIL_NOT_USED},
{0, NULL}
};
diff --git a/Python/marshal.c b/Python/marshal.c
index 4bd8bb1..ca22d6d 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -1952,6 +1952,7 @@ marshal_module_exec(PyObject *mod)
static PyModuleDef_Slot marshalmodule_slots[] = {
{Py_mod_exec, marshal_module_exec},
{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
+ {Py_mod_gil, Py_MOD_GIL_NOT_USED},
{0, NULL}
};
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index f469f16..645b76fc 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -3756,6 +3756,9 @@ _PySys_Create(PyThreadState *tstate, PyObject **sysmod_p)
if (sysmod == NULL) {
return _PyStatus_ERR("failed to create a module object");
}
+#ifdef Py_GIL_DISABLED
+ PyModule_ExperimentalSetGIL(sysmod, Py_MOD_GIL_NOT_USED);
+#endif
PyObject *sysdict = PyModule_GetDict(sysmod);
if (sysdict == NULL) {