diff options
-rw-r--r-- | Doc/c-api/module.rst | 2 | ||||
-rw-r--r-- | Lib/test/test_import/__init__.py | 41 | ||||
-rw-r--r-- | Modules/_testmultiphase.c | 18 |
3 files changed, 47 insertions, 14 deletions
diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index f7108937015..01a8e44828b 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -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 diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 207b7ae7517..f58633e0ce8 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -2386,8 +2386,10 @@ 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) + if not Py_GIL_DISABLED: with self.subTest(f'{module}: not strict'): self.check_compatible_here(module, strict=False) @@ -2398,6 +2400,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__ module = import_extension_from_file(modname, filename) @@ -2413,20 +2417,31 @@ 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__ - 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) + # _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): + + 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") def test_python_compat(self): diff --git a/Modules/_testmultiphase.c b/Modules/_testmultiphase.c index 886b260aceb..3f456e1f40d 100644 --- a/Modules/_testmultiphase.c +++ b/Modules/_testmultiphase.c @@ -969,3 +969,21 @@ 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}, + {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); +} |