bpo-1635741: Port multiprocessing ext to multiphase init (GH-21378)

Port the _multiprocessing extension module to multiphase initialization (PEP 489).
This commit is contained in:
Mohamed Koubaa 2020-08-11 05:32:35 -05:00 committed by GitHub
parent 490c5426b1
commit 1d541c25c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 61 additions and 42 deletions

View File

@ -0,0 +1 @@
Port :mod:`multiprocessing` to multi-phase initialization

View File

@ -183,35 +183,17 @@ static PyMethodDef module_methods[] = {
* Initialize * Initialize
*/ */
static struct PyModuleDef multiprocessing_module = { static int
PyModuleDef_HEAD_INIT, multiprocessing_exec(PyObject *module)
"_multiprocessing",
NULL,
-1,
module_methods,
NULL,
NULL,
NULL,
NULL
};
PyMODINIT_FUNC
PyInit__multiprocessing(void)
{ {
PyObject *module, *temp, *value = NULL;
/* Initialize module */
module = PyModule_Create(&multiprocessing_module);
if (!module)
return NULL;
#if defined(MS_WINDOWS) || \ #if defined(MS_WINDOWS) || \
(defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)) (defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED))
/* Add _PyMp_SemLock type to module */ /* Add _PyMp_SemLock type to module */
if (PyType_Ready(&_PyMp_SemLockType) < 0) if (PyModule_AddType(module, &_PyMp_SemLockType) < 0) {
return NULL; return -1;
Py_INCREF(&_PyMp_SemLockType); }
{ {
PyObject *py_sem_value_max; PyObject *py_sem_value_max;
/* Some systems define SEM_VALUE_MAX as an unsigned value that /* Some systems define SEM_VALUE_MAX as an unsigned value that
@ -223,25 +205,41 @@ PyInit__multiprocessing(void)
py_sem_value_max = PyLong_FromLong(INT_MAX); py_sem_value_max = PyLong_FromLong(INT_MAX);
else else
py_sem_value_max = PyLong_FromLong(SEM_VALUE_MAX); py_sem_value_max = PyLong_FromLong(SEM_VALUE_MAX);
if (py_sem_value_max == NULL)
return NULL; if (py_sem_value_max == NULL) {
PyDict_SetItemString(_PyMp_SemLockType.tp_dict, "SEM_VALUE_MAX", Py_DECREF(py_sem_value_max);
py_sem_value_max); return -1;
}
if (PyDict_SetItemString(_PyMp_SemLockType.tp_dict, "SEM_VALUE_MAX",
py_sem_value_max) < 0) {
Py_DECREF(py_sem_value_max);
return -1;
}
Py_DECREF(py_sem_value_max);
} }
PyModule_AddObject(module, "SemLock", (PyObject*)&_PyMp_SemLockType);
#endif #endif
/* Add configuration macros */ /* Add configuration macros */
temp = PyDict_New(); PyObject *flags = PyDict_New();
if (!temp) if (!flags) {
return NULL; return -1;
}
#define ADD_FLAG(name) \ #define ADD_FLAG(name) \
value = Py_BuildValue("i", name); \ do { \
if (value == NULL) { Py_DECREF(temp); return NULL; } \ PyObject *value = PyLong_FromLong(name); \
if (PyDict_SetItemString(temp, #name, value) < 0) { \ if (value == NULL) { \
Py_DECREF(temp); Py_DECREF(value); return NULL; } \ Py_DECREF(flags); \
Py_DECREF(value) return -1; \
} \
if (PyDict_SetItemString(flags, #name, value) < 0) { \
Py_DECREF(flags); \
Py_DECREF(value); \
return -1; \
} \
Py_DECREF(value); \
} while (0)
#if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED) #if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)
ADD_FLAG(HAVE_SEM_OPEN); ADD_FLAG(HAVE_SEM_OPEN);
@ -256,8 +254,28 @@ PyInit__multiprocessing(void)
ADD_FLAG(HAVE_BROKEN_SEM_UNLINK); ADD_FLAG(HAVE_BROKEN_SEM_UNLINK);
#endif #endif
if (PyModule_AddObject(module, "flags", temp) < 0) if (PyModule_AddObject(module, "flags", flags) < 0) {
return NULL; Py_DECREF(flags);
return -1;
}
return module; return 0;
}
static PyModuleDef_Slot multiprocessing_slots[] = {
{Py_mod_exec, multiprocessing_exec},
{0, NULL}
};
static struct PyModuleDef multiprocessing_module = {
PyModuleDef_HEAD_INIT,
.m_name = "_multiprocessing",
.m_methods = module_methods,
.m_slots = multiprocessing_slots,
};
PyMODINIT_FUNC
PyInit__multiprocessing(void)
{
return PyModuleDef_Init(&multiprocessing_module);
} }