Use sigaction instead of signal to preserve handler flags (thanks Matthew!)
authorSam Lantinga <slouken@libsdl.org>
Thu, 12 Feb 2004 16:29:24 +0000
changeset 814 5a417d2a8603
parent 813 6a2c6717b386
child 815 6176f9a0d61a
Use sigaction instead of signal to preserve handler flags (thanks Matthew!)
configure.in
src/SDL_fatal.c
--- a/configure.in	Thu Feb 12 16:05:30 2004 +0000
+++ b/configure.in	Thu Feb 12 16:29:24 2004 +0000
@@ -763,6 +763,7 @@
 [  --enable-video-fbcon    use framebuffer console video driver [default=yes]],
                   , enable_video_fbcon=yes)
     if test x$enable_video = xyes -a x$enable_video_fbcon = xyes; then
+        CFLAGS="$CFLAGS -D__KERNEL_STRICT_NAMES"
         AC_MSG_CHECKING(for framebuffer console support)
         video_fbcon=no
         AC_TRY_COMPILE([
@@ -1387,6 +1388,31 @@
     fi
 }
 
+dnl See if we can use sigaction() instead of signal()
+CheckSIGACTION()
+{
+    dnl Check for sigaction support
+    AC_ARG_ENABLE(sigaction,
+[  --enable-sigaction      use sigaction instead of signal [default=yes]],
+                  , enable_sigaction=yes)
+    if test x$enable_sigaction = xyes; then
+        AC_MSG_CHECKING(sigaction)
+        have_sigaction=no
+        AC_TRY_COMPILE([
+         #include <signal.h>
+        ],[
+         struct sigaction junk;
+         sigaction(0, &junk, &junk);
+        ],[
+        have_sigaction=yes
+        ])
+        AC_MSG_RESULT($have_sigaction)
+        if test x$have_sigaction = xyes; then
+            CFLAGS="$CFLAGS -DHAVE_SIGACTION"
+        fi
+    fi
+}
+
 dnl Determine whether the compiler can produce Win32 executables
 CheckWIN32()
 {
@@ -1775,6 +1801,7 @@
         CheckOpenGL
         CheckInputEvents
         CheckPTHREAD
+        CheckSIGACTION
         CheckAltivec
         # Set up files for the main() stub
         if test "x$video_qtopia" = "xyes"; then
@@ -1851,6 +1878,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckSIGACTION
         # Set up files for the audio library
         # We use the OSS and ALSA API's, not the Sun audio API
         #if test x$enable_audio = xyes; then
@@ -1895,6 +1923,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckSIGACTION
         CheckUSBHID
         # Set up files for the audio library
         # We use the OSS and ALSA API's, not the Sun audio API
@@ -1931,6 +1960,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckSIGACTION
         CheckUSBHID
         # Set up files for the audio library
         if test x$enable_audio = xyes; then
@@ -1971,6 +2001,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckSIGACTION
         CheckUSBHID
         # Set up files for the audio library
         if test x$enable_audio = xyes; then
@@ -2012,6 +2043,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckSIGACTION
         # Set up files for the audio library
         if test x$enable_audio = xyes; then
             CFLAGS="$CFLAGS -DSUNAUDIO_SUPPORT"
@@ -2053,6 +2085,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckSIGACTION
         # Set up files for the audio library
         if test x$enable_audio = xyes; then
             CFLAGS="$CFLAGS -DSUNAUDIO_SUPPORT"
@@ -2091,6 +2124,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckSIGACTION
         # We use the dmedia audio API, not the Sun audio API
         #if test x$enable_audio = xyes; then
         #    CFLAGS="$CFLAGS -DSUNAUDIO_SUPPORT"
@@ -2141,6 +2175,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckSIGACTION
         # Set up files for the audio library
         if test x$enable_audio = xyes; then
             CFLAGS="$CFLAGS -DSUNAUDIO_SUPPORT"
@@ -2180,6 +2215,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckSIGACTION
         # Set up files for the audio library
         if test x$enable_audio = xyes; then
             AUDIO_SUBDIRS="$AUDIO_SUBDIRS paudio"
@@ -2216,6 +2252,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckSIGACTION
         SDL_LIBS="$SDL_LIBS -lrt"
         # Set up files for the audio library
         if test x$enable_audio = xyes; then
@@ -2255,6 +2292,7 @@
         CheckX11
         CheckOpenGL
         CheckPTHREAD
+        CheckSIGACTION
         # Set up files for the audio library
         if test x$enable_audio = xyes; then
             CFLAGS="$CFLAGS -DQNXNTOAUDIO_SUPPORT"
@@ -2440,6 +2478,7 @@
         CheckQUARTZ
         CheckMacGL
         CheckPTHREAD
+        CheckSIGACTION
         # Set up files for the audio library
         if test x$enable_audio = xyes; then
             AUDIO_SUBDIRS="$AUDIO_SUBDIRS macrom"
--- 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 */