diff options
author | Victor Stinner <vstinner@python.org> | 2020-11-17 22:28:25 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-17 22:28:25 (GMT) |
commit | 7f9b25a21ab95f8cf8d663396993766307be475c (patch) | |
tree | 08ac32686ed7f5df9ae482af165b178b47dc50f3 /Modules | |
parent | 1de61d3923840b29e847d311f0c7d4c5821d98e6 (diff) | |
download | cpython-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.c | 33 |
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); } |