aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2024-06-16 12:44:37 -0700
committerZac Medico <zmedico@gentoo.org>2024-06-28 11:15:38 -0700
commit918f4a4aa82f47291deac496d13c2761f306e01f (patch)
tree6850a4211744426410060ff7ae5df2fab28ffb39
parentvartree, movefile: Warn when rewriting a symlink (diff)
downloadportage-918f4a4aa82f47291deac496d13c2761f306e01f.tar.gz
portage-918f4a4aa82f47291deac496d13c2761f306e01f.tar.bz2
portage-918f4a4aa82f47291deac496d13c2761f306e01f.zip
Allow GIL to be disabled in whirlpool C extension
In 3.13 python extensions need to declare support for GIL features, for example if they don't declare Py_MOD_GIL_NOT_USED then it will cause the GIL to be enabled even when python was launched in free-threaded mode. This requires "multi-phase initialization" because Py_mod_create is incompatible with m_slots. There's a PyUnstable_Module_SetGIL() function that can be used with single-phase init, but it's an unstable API, so it's better to use multi-phase init. There's no need to use PyModule_GetState() because the whirlpool module has no mutable state. Bug: https://bugs.gentoo.org/934220 Signed-off-by: Zac Medico <zmedico@gentoo.org>
-rw-r--r--src/portage_util__whirlpool.c46
1 files changed, 29 insertions, 17 deletions
diff --git a/src/portage_util__whirlpool.c b/src/portage_util__whirlpool.c
index 6c9421e56..4af9307c7 100644
--- a/src/portage_util__whirlpool.c
+++ b/src/portage_util__whirlpool.c
@@ -1112,30 +1112,42 @@ static PyTypeObject WhirlpoolType = {
.tp_methods = Whirlpool_methods,
};
+static int
+whirlpool_exec(PyObject *mod)
+{
+ if (PyType_Ready(&WhirlpoolType) < 0)
+ return -1;
+
+ Py_INCREF(&WhirlpoolType);
+ if (PyModule_AddObject(mod, "Whirlpool", (PyObject *) &WhirlpoolType) < 0) {
+ Py_DECREF(&WhirlpoolType);
+ return -1;
+ }
+
+ return 0;
+}
+
+static PyModuleDef_Slot _whirlpoolmodule_slots[] = {
+ {Py_mod_exec, whirlpool_exec},
+#ifdef Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
+ {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
+#endif
+#ifdef Py_MOD_GIL_NOT_USED
+ {Py_mod_gil, Py_MOD_GIL_NOT_USED},
+#endif
+ {0, NULL},
+};
+
static PyModuleDef moduledef = {
PyModuleDef_HEAD_INIT,
.m_name = "_whirlpool",
.m_doc = "Reference Whirlpool implementation",
- .m_size = -1,
+ .m_size = 0,
+ .m_slots = _whirlpoolmodule_slots,
};
PyMODINIT_FUNC
PyInit__whirlpool(void)
{
- PyObject *m;
- if (PyType_Ready(&WhirlpoolType) < 0)
- return NULL;
-
- m = PyModule_Create(&moduledef);
- if (m == NULL)
- return NULL;
-
- Py_INCREF(&WhirlpoolType);
- if (PyModule_AddObject(m, "Whirlpool", (PyObject *) &WhirlpoolType) < 0) {
- Py_DECREF(&WhirlpoolType);
- Py_DECREF(m);
- return NULL;
- }
-
- return m;
+ return PyModuleDef_Init(&moduledef);
}