[3.12] gh-129405: Fix doc for Py_mod_multiple_interpreters default, and add test (GH-129406) (GH-130510)

This commit is contained in:
Petr Viktorin 2025-02-27 16:30:46 +01:00 committed by GitHub
parent e280c493f1
commit a678d8e511
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 47 additions and 17 deletions

View file

@ -415,7 +415,7 @@ The available slot types are:
in one module definition.
If ``Py_mod_multiple_interpreters`` is not specified, the import
machinery defaults to ``Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED``.
machinery defaults to ``Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED``.
.. versionadded:: 3.12

View file

@ -1900,6 +1900,7 @@ class SubinterpImportTests(unittest.TestCase):
@unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module")
def test_multi_init_extension_compat(self):
# Module with Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
module = '_testmultiphase'
require_extension(module)
with self.subTest(f'{module}: not strict'):
@ -1911,6 +1912,8 @@ class SubinterpImportTests(unittest.TestCase):
@unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module")
def test_multi_init_extension_non_isolated_compat(self):
# Module with Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED
# and Py_MOD_GIL_NOT_USED
modname = '_test_non_isolated'
filename = _testmultiphase.__file__
loader = ExtensionFileLoader(modname, filename)
@ -1929,23 +1932,33 @@ class SubinterpImportTests(unittest.TestCase):
@unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module")
def test_multi_init_extension_per_interpreter_gil_compat(self):
modname = '_test_shared_gil_only'
filename = _testmultiphase.__file__
loader = ExtensionFileLoader(modname, filename)
spec = importlib.util.spec_from_loader(modname, loader)
module = importlib.util.module_from_spec(spec)
loader.exec_module(module)
sys.modules[modname] = module
# _test_shared_gil_only:
# Explicit Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED (default)
# and Py_MOD_GIL_NOT_USED
# _test_no_multiple_interpreter_slot:
# No Py_mod_multiple_interpreters slot
# and Py_MOD_GIL_NOT_USED
for modname in ('_test_shared_gil_only',
'_test_no_multiple_interpreter_slot'):
with self.subTest(modname=modname):
require_extension(module)
with self.subTest(f'{modname}: isolated, strict'):
self.check_incompatible_here(modname, filename, isolated=True)
with self.subTest(f'{modname}: not isolated, strict'):
self.check_compatible_here(modname, filename,
strict=True, isolated=False)
with self.subTest(f'{modname}: not isolated, not strict'):
self.check_compatible_here(modname, filename,
strict=False, isolated=False)
filename = _testmultiphase.__file__
loader = ExtensionFileLoader(modname, filename)
spec = importlib.util.spec_from_loader(modname, loader)
module = importlib.util.module_from_spec(spec)
loader.exec_module(module)
sys.modules[modname] = module
require_extension(module)
with self.subTest(f'{modname}: isolated, strict'):
self.check_incompatible_here(modname, filename,
isolated=True)
with self.subTest(f'{modname}: not isolated, strict'):
self.check_compatible_here(modname, filename,
strict=True, isolated=False)
with self.subTest(f'{modname}: not isolated, not strict'):
self.check_compatible_here(
modname, filename, strict=False, isolated=False)
def test_python_compat(self):
module = 'threading'

View file

@ -967,3 +967,20 @@ PyInit__test_shared_gil_only(void)
{
return PyModuleDef_Init(&shared_gil_only_def);
}
static PyModuleDef_Slot no_multiple_interpreter_slot_slots[] = {
{Py_mod_exec, execfunc},
{0, NULL},
};
static PyModuleDef no_multiple_interpreter_slot_def = TEST_MODULE_DEF(
"_test_no_multiple_interpreter_slot",
no_multiple_interpreter_slot_slots,
testexport_methods);
PyMODINIT_FUNC
PyInit__test_no_multiple_interpreter_slot(void)
{
return PyModuleDef_Init(&no_multiple_interpreter_slot_def);
}