diff src/SDL_fatal.c @ 814:5a417d2a8603

Use sigaction instead of signal to preserve handler flags (thanks Matthew!)
author Sam Lantinga <slouken@libsdl.org>
date Thu, 12 Feb 2004 16:29:24 +0000
parents b8d311d90021
children abb915adb1b0
line wrap: on
line diff
--- a/src/SDL_fatal.c	Thu Feb 12 16:05:30 2004 +0000
+++ b/src/SDL_fatal.c	Thu Feb 12 16:29:24 2004 +0000
@@ -127,47 +127,63 @@
 
 void SDL_InstallParachute(void)
 {
+	/* Set a handler for any fatal signal not already handled */
 	int i;
+#ifdef HAVE_SIGACTION
+	struct sigaction action;
+
+	for ( i=0; SDL_fatal_signals[i]; ++i ) {
+		sigaction(SDL_fatal_signals[i], NULL, &action);
+		if ( action.sa_handler == SIG_DFL ) {
+			action.sa_handler = SDL_Parachute;
+			sigaction(SDL_fatal_signals[i], &action, NULL);
+		}
+	}
+#ifdef SIGALRM
+	/* Set SIGALRM to be ignored -- necessary on Solaris */
+	sigaction(SIGALRM, NULL, &action);
+	if ( action.sa_handler == SIG_DFL ) {
+		action.sa_handler = SIG_IGN;
+		sigaction(SDL_fatal_signals[i], &action, NULL);
+	}
+#endif
+#else
 	void (*ohandler)(int);
 
-	/* Set a handler for any fatal signal not already handled */
 	for ( i=0; SDL_fatal_signals[i]; ++i ) {
 		ohandler = signal(SDL_fatal_signals[i], SDL_Parachute);
 		if ( ohandler != SIG_DFL ) {
 			signal(SDL_fatal_signals[i], ohandler);
 		}
 	}
-#ifdef SIGALRM
-	/* Set SIGALRM to be ignored -- necessary on Solaris */
-	{
-		struct sigaction action, oaction;
-
-		/* Set SIG_IGN action */
-		memset(&action, 0, (sizeof action));
-		action.sa_handler = SIG_IGN;
-		sigaction(SIGALRM, &action, &oaction);
-
-		/* Reset original action if it was already being handled */
-		if ( oaction.sa_handler != SIG_DFL ) {
-			sigaction(SIGALRM, &oaction, NULL);
-		}
-	}
-#endif
+#endif /* HAVE_SIGACTION */
 	return;
 }
 
 void SDL_UninstallParachute(void)
 {
+	/* Remove a handler for any fatal signal handled */
 	int i;
+#ifdef HAVE_SIGACTION
+	struct sigaction action;
+
+	for ( i=0; SDL_fatal_signals[i]; ++i ) {
+		sigaction(SDL_fatal_signals[i], NULL, &action);
+		if ( action.sa_handler == SDL_Parachute ) {
+			action.sa_handler = SIG_DFL;
+			sigaction(SDL_fatal_signals[i], &action, NULL);
+		}
+	}
+#else
 	void (*ohandler)(int);
 
-	/* Remove a handler for any fatal signal handled */
 	for ( i=0; SDL_fatal_signals[i]; ++i ) {
 		ohandler = signal(SDL_fatal_signals[i], SIG_DFL);
 		if ( ohandler != SDL_Parachute ) {
 			signal(SDL_fatal_signals[i], ohandler);
 		}
 	}
+#endif /* HAVE_SIGACTION */
 }
 
 #endif /* NO_SIGNAL_H */