Mercurial > sdl-ios-xcode
changeset 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 | 6a2c6717b386 |
children | 6176f9a0d61a |
files | configure.in src/SDL_fatal.c |
diffstat | 2 files changed, 73 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- 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 */