bpo-41713: Port _signal module to multi-phase init (GH-23355)

Port the _signal extension module to the multi-phase initialization
API (PEP 489).

Co-Authored-By: Mohamed Koubaa <koubaa.m@gmail.com>
This commit is contained in:
Victor Stinner 2020-11-17 23:28:25 +01:00 committed by GitHub
parent 1de61d3923
commit 7f9b25a21a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 16 deletions

View File

@ -0,0 +1,2 @@
Port the ``_signal`` extension module to the multi-phase initialization API
(:pep:`489`). Patch by Victor Stinner and Mohamed Koubaa.

View File

@ -1538,7 +1538,7 @@ signal_add_constants(PyObject *module)
static int static int
signal_exec(PyObject *m) signal_module_exec(PyObject *m)
{ {
assert(!PyErr_Occurred()); assert(!PyErr_Occurred());
@ -1568,15 +1568,19 @@ signal_exec(PyObject *m)
// Get signal handlers // Get signal handlers
for (int signum = 1; signum < NSIG; signum++) { for (int signum = 1; signum < NSIG; signum++) {
void (*c_handler)(int) = PyOS_getsig(signum); void (*c_handler)(int) = PyOS_getsig(signum);
PyObject *func;
if (c_handler == SIG_DFL) { if (c_handler == SIG_DFL) {
Handlers[signum].func = Py_NewRef(DefaultHandler); func = DefaultHandler;
} }
else if (c_handler == SIG_IGN) { else if (c_handler == SIG_IGN) {
Handlers[signum].func = Py_NewRef(IgnoreHandler); func = IgnoreHandler;
} }
else { else {
Handlers[signum].func = Py_NewRef(Py_None); // None of our business func = Py_None; // None of our business
} }
// If signal_module_exec() is called more than one, we must
// clear the strong reference to the previous function.
Py_XSETREF(Handlers[signum].func, Py_NewRef(func));
} }
// Instal Python SIGINT handler which raises KeyboardInterrupt // Instal Python SIGINT handler which raises KeyboardInterrupt
@ -1595,28 +1599,25 @@ signal_exec(PyObject *m)
} }
static struct PyModuleDef signalmodule = { static PyModuleDef_Slot signal_slots[] = {
{Py_mod_exec, signal_module_exec},
{0, NULL}
};
static struct PyModuleDef signal_module = {
PyModuleDef_HEAD_INIT, PyModuleDef_HEAD_INIT,
"_signal", "_signal",
.m_doc = module_doc, .m_doc = module_doc,
.m_size = -1, .m_size = 0,
.m_methods = signal_methods, .m_methods = signal_methods,
.m_slots = signal_slots,
}; };
PyMODINIT_FUNC PyMODINIT_FUNC
PyInit__signal(void) PyInit__signal(void)
{ {
PyObject *mod = PyModule_Create(&signalmodule); return PyModuleDef_Init(&signal_module);
if (mod == NULL) {
return NULL;
}
if (signal_exec(mod) < 0) {
Py_DECREF(mod);
return NULL;
}
return mod;
} }