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
signal_exec(PyObject *m)
signal_module_exec(PyObject *m)
{
assert(!PyErr_Occurred());
@ -1568,15 +1568,19 @@ signal_exec(PyObject *m)
// Get signal handlers
for (int signum = 1; signum < NSIG; signum++) {
void (*c_handler)(int) = PyOS_getsig(signum);
PyObject *func;
if (c_handler == SIG_DFL) {
Handlers[signum].func = Py_NewRef(DefaultHandler);
func = DefaultHandler;
}
else if (c_handler == SIG_IGN) {
Handlers[signum].func = Py_NewRef(IgnoreHandler);
func = IgnoreHandler;
}
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
@ -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,
"_signal",
.m_doc = module_doc,
.m_size = -1,
.m_size = 0,
.m_methods = signal_methods,
.m_slots = signal_slots,
};
PyMODINIT_FUNC
PyInit__signal(void)
{
PyObject *mod = PyModule_Create(&signalmodule);
if (mod == NULL) {
return NULL;
}
if (signal_exec(mod) < 0) {
Py_DECREF(mod);
return NULL;
}
return mod;
return PyModuleDef_Init(&signal_module);
}