Patch #975056 - fixes for restartable signals on *BSD. In addition,

a few remaining calls to signal() were converted to PyOS_setsig().
This commit is contained in:
Anthony Baxter 2004-10-13 14:48:50 +00:00
parent 7d428788e1
commit 9ceaa72ebe
5 changed files with 28 additions and 48 deletions

View file

@ -137,7 +137,7 @@ intcatcher(int sig)
Py_Exit(1);
break;
}
signal(SIGINT, intcatcher);
PyOS_setsig(SIGINT, intcatcher);
Py_AddPendingCall(checksignals_witharg, NULL);
}
@ -146,23 +146,14 @@ static void (*old_siginthandler)(int) = SIG_DFL;
void
PyOS_InitInterrupts(void)
{
if ((old_siginthandler = signal(SIGINT, SIG_IGN)) != SIG_IGN)
signal(SIGINT, intcatcher);
#ifdef HAVE_SIGINTERRUPT
/* This is for SunOS and other modern BSD derivatives.
It means that system calls (like read()) are not restarted
after an interrupt. This is necessary so interrupting a
read() or readline() call works as expected.
XXX On old BSD (pure 4.2 or older) you may have to do this
differently! */
siginterrupt(SIGINT, 1);
#endif /* HAVE_SIGINTERRUPT */
if ((old_siginthandler = PyOS_setsig(SIGINT, SIG_IGN)) != SIG_IGN)
PyOS_setsig(SIGINT, intcatcher);
}
void
PyOS_FiniInterrupts(void)
{
signal(SIGINT, old_siginthandler);
PyOS_setsig(SIGINT, old_siginthandler);
}
int