Mercurial > cpython-lru_cache-weakref
diff Python/pythonrun.c @ 33747:b0ec4c9d595b legacy-trunk
Patch #975056 - fixes for restartable signals on *BSD. In addition,
a few remaining calls to signal() were converted to PyOS_setsig().
| author | Anthony Baxter <anthonybaxter@gmail.com> |
|---|---|
| date | Wed, 13 Oct 2004 14:48:50 +0000 |
| parents | a46b76eb9053 |
| children | 28892e6512ba 3785610ff763 |
line wrap: on
line diff
--- a/Python/pythonrun.c Wed Oct 13 14:15:32 2004 +0000 +++ b/Python/pythonrun.c Wed Oct 13 14:48:50 2004 +0000 @@ -1576,13 +1576,13 @@ initsigs(void) { #ifdef SIGPIPE - signal(SIGPIPE, SIG_IGN); + PyOS_setsig(SIGPIPE, SIG_IGN); #endif #ifdef SIGXFZ - signal(SIGXFZ, SIG_IGN); + PyOS_setsig(SIGXFZ, SIG_IGN); #endif #ifdef SIGXFSZ - signal(SIGXFSZ, SIG_IGN); + PyOS_setsig(SIGXFSZ, SIG_IGN); #endif PyOS_InitInterrupts(); /* May imply initsignal() */ } @@ -1646,18 +1646,14 @@ { #ifdef HAVE_SIGACTION struct sigaction context; - /* Initialize context.sa_handler to SIG_ERR which makes about as - * much sense as anything else. It should get overwritten if - * sigaction actually succeeds and otherwise we avoid an - * uninitialized memory read. - */ - context.sa_handler = SIG_ERR; - sigaction(sig, NULL, &context); + if (sigaction(sig, NULL, &context) == -1) + return SIG_ERR; return context.sa_handler; #else PyOS_sighandler_t handler; handler = signal(sig, SIG_IGN); - signal(sig, handler); + if (handler != SIG_ERR) + signal(sig, handler); return handler; #endif } @@ -1666,20 +1662,19 @@ PyOS_setsig(int sig, PyOS_sighandler_t handler) { #ifdef HAVE_SIGACTION - struct sigaction context; + struct sigaction context, ocontext; + context.sa_handler = handler; + sigemptyset(&context.sa_mask); + context.sa_flags = 0; + if (sigaction(sig, &context, &ocontext) == -1) + return SIG_ERR; + return ocontext.sa_handler; +#else PyOS_sighandler_t oldhandler; - /* Initialize context.sa_handler to SIG_ERR which makes about as - * much sense as anything else. It should get overwritten if - * sigaction actually succeeds and otherwise we avoid an - * uninitialized memory read. - */ - context.sa_handler = SIG_ERR; - sigaction(sig, NULL, &context); - oldhandler = context.sa_handler; - context.sa_handler = handler; - sigaction(sig, &context, NULL); + oldhandler = signal(sig, handler); +#ifdef HAVE_SIGINTERRUPT + siginterrupt(sig, 1); +#endif return oldhandler; -#else - return signal(sig, handler); #endif }
