summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-11-17 22:28:25 (GMT)
committerGitHub <noreply@github.com>2020-11-17 22:28:25 (GMT)
commit7f9b25a21ab95f8cf8d663396993766307be475c (patch)
tree08ac32686ed7f5df9ae482af165b178b47dc50f3 /Modules
parent1de61d3923840b29e847d311f0c7d4c5821d98e6 (diff)
downloadcpython-7f9b25a21ab95f8cf8d663396993766307be475c.zip
cpython-7f9b25a21ab95f8cf8d663396993766307be475c.tar.gz
cpython-7f9b25a21ab95f8cf8d663396993766307be475c.tar.bz2
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>
Diffstat (limited to 'Modules')
-rw-r--r--Modules/signalmodule.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index acaaafe..fcc8f1c 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -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);
}