◐ Shell
clean mode source ↗

bpo-41713: Port _signal module to multi-phase init by vstinner · Pull Request #23355 · python/cpython

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