]> gitweb.factorcode.org Git - factor.git/commitdiff
Added a fix for sigaction(): now retries on recoverable error EINTR
authorDoug Coleman <erg@trifocus.net>
Tue, 31 Jan 2006 01:11:22 +0000 (01:11 +0000)
committerDoug Coleman <erg@trifocus.net>
Tue, 31 Jan 2006 01:11:22 +0000 (01:11 +0000)
native/unix/signal.c

index b05d5e490a4b5fdd1a50b9372263b2644eacd24c..12ab7cbaf382012d0a462cf0cd28478290dd762d 100644 (file)
@@ -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();