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

This commit is contained in:
Petr Viktorin 2025-02-24 14:59:19 +01:00 committed by GitHub
parent 805839021b
commit fc8d2cba54
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 47 additions and 14 deletions

View file

@ -415,7 +415,7 @@ The available slot types are:
in one module definition. in one module definition.
If ``Py_mod_multiple_interpreters`` is not specified, the import 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 .. versionadded:: 3.12

View file

@ -2386,8 +2386,10 @@ class SubinterpImportTests(unittest.TestCase):
@unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module") @unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module")
def test_multi_init_extension_compat(self): def test_multi_init_extension_compat(self):
# Module with Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
module = '_testmultiphase' module = '_testmultiphase'
require_extension(module) require_extension(module)
if not Py_GIL_DISABLED: if not Py_GIL_DISABLED:
with self.subTest(f'{module}: not strict'): with self.subTest(f'{module}: not strict'):
self.check_compatible_here(module, strict=False) self.check_compatible_here(module, strict=False)
@ -2398,6 +2400,8 @@ class SubinterpImportTests(unittest.TestCase):
@unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module") @unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module")
def test_multi_init_extension_non_isolated_compat(self): 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' modname = '_test_non_isolated'
filename = _testmultiphase.__file__ filename = _testmultiphase.__file__
module = import_extension_from_file(modname, filename) module = import_extension_from_file(modname, filename)
@ -2413,20 +2417,31 @@ class SubinterpImportTests(unittest.TestCase):
@unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module") @unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module")
def test_multi_init_extension_per_interpreter_gil_compat(self): def test_multi_init_extension_per_interpreter_gil_compat(self):
modname = '_test_shared_gil_only'
filename = _testmultiphase.__file__
module = import_extension_from_file(modname, filename)
require_extension(module) # _test_shared_gil_only:
with self.subTest(f'{modname}: isolated, strict'): # Explicit Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED (default)
self.check_incompatible_here(modname, filename, isolated=True) # and Py_MOD_GIL_NOT_USED
with self.subTest(f'{modname}: not isolated, strict'): # _test_no_multiple_interpreter_slot:
self.check_compatible_here(modname, filename, # No Py_mod_multiple_interpreters slot
strict=True, isolated=False) # and Py_MOD_GIL_NOT_USED
if not Py_GIL_DISABLED: for modname in ('_test_shared_gil_only',
with self.subTest(f'{modname}: not isolated, not strict'): '_test_no_multiple_interpreter_slot'):
self.check_compatible_here(modname, filename, with self.subTest(modname=modname):
strict=False, isolated=False)
filename = _testmultiphase.__file__
module = import_extension_from_file(modname, filename)
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)
if not Py_GIL_DISABLED:
with self.subTest(f'{modname}: not isolated, not strict'):
self.check_compatible_here(
modname, filename, strict=False, isolated=False)
@unittest.skipIf(_testinternalcapi is None, "requires _testinternalcapi") @unittest.skipIf(_testinternalcapi is None, "requires _testinternalcapi")
def test_python_compat(self): def test_python_compat(self):

View file

@ -969,3 +969,21 @@ PyInit__test_shared_gil_only(void)
{ {
return PyModuleDef_Init(&shared_gil_only_def); return PyModuleDef_Init(&shared_gil_only_def);
} }
static PyModuleDef_Slot no_multiple_interpreter_slot_slots[] = {
{Py_mod_exec, execfunc},
{Py_mod_gil, Py_MOD_GIL_NOT_USED},
{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);
}