Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Port the ``_signal`` extension module to the multi-phase initialization API
(:pep:`489`). Patch by Victor Stinner and Mohamed Koubaa.
33 changes: 17 additions & 16 deletions Modules/signalmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -1538,7 +1538,7 @@ signal_add_constants(PyObject *module)


static int
signal_exec(PyObject *m)
signal_module_exec(PyObject *m)
{
assert(!PyErr_Occurred());

Expand Down Expand Up @@ -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
Expand All @@ -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);
}


Expand Down