diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -89,7 +89,7 @@ static pid_t main_pid; #endif static struct { - int tripped; + sig_atomic_t tripped; PyObject *func; } Handlers[NSIG]; @@ -177,7 +177,7 @@ static void trip_signal(int sig_num) { unsigned char byte; - Handlers[sig_num].tripped = 1; + Handlers[sig_num].tripped += 1; if (is_tripped) return; /* Set is_tripped after setting .tripped, as it gets @@ -1139,8 +1139,9 @@ finisignal(void) int PyErr_CheckSignals(void) { - int i; + int signum; PyObject *f; + int i, times; if (!is_tripped) return 0; @@ -1169,14 +1170,15 @@ PyErr_CheckSignals(void) if (!(f = (PyObject *)PyEval_GetFrame())) f = Py_None; - for (i = 1; i < NSIG; i++) { - if (Handlers[i].tripped) { + for (signum = 1; signum < NSIG; signum++) { + times = Handlers[signum].tripped; + Handlers[signum].tripped = 0; + for (i=0; i < times; i++) { PyObject *result = NULL; - PyObject *arglist = Py_BuildValue("(iO)", i, f); - Handlers[i].tripped = 0; + PyObject *arglist = Py_BuildValue("(iO)", signum, f); if (arglist) { - result = PyEval_CallObject(Handlers[i].func, + result = PyEval_CallObject(Handlers[signum].func, arglist); Py_DECREF(arglist); }