Skip to content

Commit 7f9b25a

Browse files
vstinnerkoubaa
andauthored
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 <[email protected]>
1 parent 1de61d3 commit 7f9b25a

File tree

2 files changed

+19
-16
lines changed

2 files changed

+19
-16
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Port the ``_signal`` extension module to the multi-phase initialization API
2+
(:pep:`489`). Patch by Victor Stinner and Mohamed Koubaa.

‎Modules/signalmodule.c‎

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,7 +1538,7 @@ signal_add_constants(PyObject *module)
15381538

15391539

15401540
static int
1541-
signal_exec(PyObject *m)
1541+
signal_module_exec(PyObject *m)
15421542
{
15431543
assert(!PyErr_Occurred());
15441544

@@ -1568,15 +1568,19 @@ signal_exec(PyObject *m)
15681568
// Get signal handlers
15691569
for (int signum = 1; signum < NSIG; signum++) {
15701570
void (*c_handler)(int) = PyOS_getsig(signum);
1571+
PyObject *func;
15711572
if (c_handler == SIG_DFL) {
1572-
Handlers[signum].func = Py_NewRef(DefaultHandler);
1573+
func = DefaultHandler;
15731574
}
15741575
else if (c_handler == SIG_IGN) {
1575-
Handlers[signum].func = Py_NewRef(IgnoreHandler);
1576+
func = IgnoreHandler;
15761577
}
15771578
else {
1578-
Handlers[signum].func = Py_NewRef(Py_None); // None of our business
1579+
func = Py_None; // None of our business
15791580
}
1581+
// If signal_module_exec() is called more than one, we must
1582+
// clear the strong reference to the previous function.
1583+
Py_XSETREF(Handlers[signum].func, Py_NewRef(func));
15801584
}
15811585

15821586
// Instal Python SIGINT handler which raises KeyboardInterrupt
@@ -1595,28 +1599,25 @@ signal_exec(PyObject *m)
15951599
}
15961600

15971601

1598-
static struct PyModuleDef signalmodule = {
1602+
static PyModuleDef_Slot signal_slots[] = {
1603+
{Py_mod_exec, signal_module_exec},
1604+
{0, NULL}
1605+
};
1606+
1607+
static struct PyModuleDef signal_module = {
15991608
PyModuleDef_HEAD_INIT,
16001609
"_signal",
16011610
.m_doc = module_doc,
1602-
.m_size = -1,
1611+
.m_size = 0,
16031612
.m_methods = signal_methods,
1613+
.m_slots = signal_slots,
16041614
};
16051615

16061616

16071617
PyMODINIT_FUNC
16081618
PyInit__signal(void)
16091619
{
1610-
PyObject *mod = PyModule_Create(&signalmodule);
1611-
if (mod == NULL) {
1612-
return NULL;
1613-
}
1614-
1615-
if (signal_exec(mod) < 0) {
1616-
Py_DECREF(mod);
1617-
return NULL;
1618-
}
1619-
return mod;
1620+
return PyModuleDef_Init(&signal_module);
16201621
}
16211622

16221623

0 commit comments

Comments
 (0)