From ace98260e39b0a1acd2e0558bbb91a6007b425e5 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 31 Jan 2006 01:11:22 +0000 Subject: [PATCH] Added a fix for sigaction(): now retries on recoverable error EINTR --- native/unix/signal.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/native/unix/signal.c b/native/unix/signal.c index b05d5e490a..12ab7cbaf3 100644 --- a/native/unix/signal.c +++ b/native/unix/signal.c @@ -17,6 +17,15 @@ void signal_handler(int signal, siginfo_t* siginfo, void* uap) signal_error(signal); } +static void sigaction_safe(int signum, const struct sigaction *act, struct sigaction *oldact) +{ + int ret; + do + { + ret = sigaction(signum, act, oldact); + } while(ret == -1 && errno == EINTR); +} + void init_signals(void) { struct sigaction custom_sigaction; @@ -25,15 +34,15 @@ void init_signals(void) sigemptyset(&custom_sigaction.sa_mask); custom_sigaction.sa_sigaction = signal_handler; custom_sigaction.sa_flags = SA_SIGINFO; - sigaction(SIGABRT,&custom_sigaction,NULL); - sigaction(SIGFPE,&custom_sigaction,NULL); - sigaction(SIGBUS,&custom_sigaction,NULL); - sigaction(SIGQUIT,&custom_sigaction,NULL); - sigaction(SIGSEGV,&custom_sigaction,NULL); + sigaction_safe(SIGABRT,&custom_sigaction,NULL); + sigaction_safe(SIGFPE,&custom_sigaction,NULL); + sigaction_safe(SIGBUS,&custom_sigaction,NULL); + sigaction_safe(SIGQUIT,&custom_sigaction,NULL); + sigaction_safe(SIGSEGV,&custom_sigaction,NULL); sigemptyset(&ign_sigaction.sa_mask); ign_sigaction.sa_handler = SIG_IGN; - sigaction(SIGPIPE,&ign_sigaction,NULL); + sigaction_safe(SIGPIPE,&ign_sigaction,NULL); #ifdef __APPLE__ mach_initialize();