mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
gh-104108: Add the Py_mod_multiple_interpreters Module Def Slot (gh-104148)
I'll be adding a value to indicate support for per-interpreter GIL in gh-99114.
This commit is contained in:
parent
55671fe047
commit
1c420e138f
5 changed files with 122 additions and 22 deletions
|
@ -245,6 +245,8 @@ PyModule_FromDefAndSpec2(PyModuleDef* def, PyObject *spec, int module_api_versio
|
|||
PyObject *(*create)(PyObject *, PyModuleDef*) = NULL;
|
||||
PyObject *nameobj;
|
||||
PyObject *m = NULL;
|
||||
int has_multiple_interpreters_slot = 0;
|
||||
void *multiple_interpreters = (void *)0;
|
||||
int has_execution_slots = 0;
|
||||
const char *name;
|
||||
int ret;
|
||||
|
@ -287,6 +289,17 @@ PyModule_FromDefAndSpec2(PyModuleDef* def, PyObject *spec, int module_api_versio
|
|||
case Py_mod_exec:
|
||||
has_execution_slots = 1;
|
||||
break;
|
||||
case Py_mod_multiple_interpreters:
|
||||
if (has_multiple_interpreters_slot) {
|
||||
PyErr_Format(
|
||||
PyExc_SystemError,
|
||||
"module %s has more than one 'multiple interpreters' slots",
|
||||
name);
|
||||
goto error;
|
||||
}
|
||||
multiple_interpreters = cur_slot->value;
|
||||
has_multiple_interpreters_slot = 1;
|
||||
break;
|
||||
default:
|
||||
assert(cur_slot->slot < 0 || cur_slot->slot > _Py_mod_LAST_SLOT);
|
||||
PyErr_Format(
|
||||
|
@ -297,6 +310,20 @@ PyModule_FromDefAndSpec2(PyModuleDef* def, PyObject *spec, int module_api_versio
|
|||
}
|
||||
}
|
||||
|
||||
/* By default, multi-phase init modules are expected
|
||||
to work under multiple interpreters. */
|
||||
if (!has_multiple_interpreters_slot) {
|
||||
multiple_interpreters = Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED;
|
||||
}
|
||||
if (multiple_interpreters == Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED) {
|
||||
PyInterpreterState *interp = _PyInterpreterState_GET();
|
||||
if (!_Py_IsMainInterpreter(interp)
|
||||
&& _PyImport_CheckSubinterpIncompatibleExtensionAllowed(name) < 0)
|
||||
{
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
if (create) {
|
||||
m = create(spec, def);
|
||||
if (m == NULL) {
|
||||
|
@ -421,6 +448,9 @@ PyModule_ExecDef(PyObject *module, PyModuleDef *def)
|
|||
return -1;
|
||||
}
|
||||
break;
|
||||
case Py_mod_multiple_interpreters:
|
||||
/* handled in PyModule_FromDefAndSpec2 */
|
||||
break;
|
||||
default:
|
||||
PyErr_Format(
|
||||
PyExc_SystemError,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue