From 644f577adb3a46e5ae53262e9752df16819355b2 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 12 Feb 2004 16:29:24 +0000 Subject: [PATCH] Use sigaction instead of signal to preserve handler flags (thanks Matthew!) --- configure.in | 39 +++++++++++++++++++++++++++++++++++++++ src/SDL_fatal.c | 48 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 71 insertions(+), 16 deletions(-) diff --git a/configure.in b/configure.in index 422cef619..e0580ace2 100644 --- a/configure.in +++ b/configure.in @@ -763,6 +763,7 @@ CheckFBCON() [ --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 @@ CopyUnixThreadSource() 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 + ],[ + 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 @@ case "$target" in CheckOpenGL CheckInputEvents CheckPTHREAD + CheckSIGACTION CheckAltivec # Set up files for the main() stub if test "x$video_qtopia" = "xyes"; then @@ -1851,6 +1878,7 @@ case "$target" in 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 @@ case "$target" in 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 @@ case "$target" in CheckAAlib CheckOpenGL CheckPTHREAD + CheckSIGACTION CheckUSBHID # Set up files for the audio library if test x$enable_audio = xyes; then @@ -1971,6 +2001,7 @@ case "$target" in CheckAAlib CheckOpenGL CheckPTHREAD + CheckSIGACTION CheckUSBHID # Set up files for the audio library if test x$enable_audio = xyes; then @@ -2012,6 +2043,7 @@ case "$target" in 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 @@ case "$target" in 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 @@ case "$target" in 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 @@ case "$target" in 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 @@ case "$target" in 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 @@ case "$target" in 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 @@ case "$target" in 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 @@ case "$target" in CheckQUARTZ CheckMacGL CheckPTHREAD + CheckSIGACTION # Set up files for the audio library if test x$enable_audio = xyes; then AUDIO_SUBDIRS="$AUDIO_SUBDIRS macrom" diff --git a/src/SDL_fatal.c b/src/SDL_fatal.c index 23980a776..a1714eaf0 100644 --- a/src/SDL_fatal.c +++ b/src/SDL_fatal.c @@ -127,47 +127,63 @@ static int SDL_fatal_signals[] = { void SDL_InstallParachute(void) { + /* Set a handler for any fatal signal not already handled */ int i; - void (*ohandler)(int); +#ifdef HAVE_SIGACTION + struct sigaction action; - /* 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); + 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 */ - { - struct sigaction action, oaction; - - /* Set SIG_IGN action */ - memset(&action, 0, (sizeof action)); + sigaction(SIGALRM, NULL, &action); + if ( action.sa_handler == SIG_DFL ) { action.sa_handler = SIG_IGN; - sigaction(SIGALRM, &action, &oaction); + sigaction(SDL_fatal_signals[i], &action, NULL); + } +#endif +#else + void (*ohandler)(int); - /* Reset original action if it was already being handled */ - if ( oaction.sa_handler != SIG_DFL ) { - sigaction(SIGALRM, &oaction, NULL); + 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); } } -#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 */