diff --git a/stepmania/src/arch/ArchHooks/ArchHooks_Unix.cpp b/stepmania/src/arch/ArchHooks/ArchHooks_Unix.cpp index 06a5e1237a..451d93da26 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks_Unix.cpp +++ b/stepmania/src/arch/ArchHooks/ArchHooks_Unix.cpp @@ -33,30 +33,32 @@ static bool IsFatalSignal( int signal ) } } -static void DoCleanShutdown( int signal, siginfo_t *si, const ucontext_t *uc ) +static bool DoCleanShutdown( int signal, siginfo_t *si, const ucontext_t *uc ) { if( IsFatalSignal(signal) ) - return; + return false; /* ^C. */ ArchHooks::SetUserQuit(); + return true; } #if defined(CRASH_HANDLER) -static void DoCrashSignalHandler( int signal, siginfo_t *si, const ucontext_t *uc ) +static bool DoCrashSignalHandler( int signal, siginfo_t *si, const ucontext_t *uc ) { /* Don't dump a debug file if the user just hit ^C. */ if( !IsFatalSignal(signal) ) - return; + return true; CrashHandler::CrashSignalHandler( signal, si, uc ); + return false; } #endif -static void EmergencyShutdown( int signal, siginfo_t *si, const ucontext_t *uc ) +static bool EmergencyShutdown( int signal, siginfo_t *si, const ucontext_t *uc ) { if( !IsFatalSignal(signal) ) - return; + return false; DoEmergencyShutdown(); @@ -68,6 +70,7 @@ static void EmergencyShutdown( int signal, siginfo_t *si, const ucontext_t *uc ) SignalHandler::ResetSignalHandlers(); raise( signal ); #endif + return false; } #if defined(HAVE_TLS) diff --git a/stepmania/src/archutils/Unix/SignalHandler.cpp b/stepmania/src/archutils/Unix/SignalHandler.cpp index 6bd52ca55a..c3bda69129 100644 --- a/stepmania/src/archutils/Unix/SignalHandler.cpp +++ b/stepmania/src/archutils/Unix/SignalHandler.cpp @@ -71,8 +71,23 @@ SaveSignals::~SaveSignals() static void SigHandler( int signal, siginfo_t *si, void *ucp ) { + bool bMaskSignal = false; for( unsigned i = 0; i < handlers.size(); ++i ) - handlers[i]( signal, si, (const ucontext_t *)ucp ); + bMaskSignal |= handlers[i]( signal, si, (const ucontext_t *)ucp ); + if( !bMaskSignal ) + { + struct sigaction sa; + sa.sa_flags = 0; + sigemptyset( &sa.sa_mask ); + + /* Set up the default signal handler. */ + sa.sa_handler = SIG_DFL; + + struct sigaction old; + sigaction( signal, &sa, &old ); + raise( signal ); + sigaction( signal, &old, NULL ); + } } int find_stack_direction2( char *p ) diff --git a/stepmania/src/archutils/Unix/SignalHandler.h b/stepmania/src/archutils/Unix/SignalHandler.h index 63f9d22530..c29328474e 100644 --- a/stepmania/src/archutils/Unix/SignalHandler.h +++ b/stepmania/src/archutils/Unix/SignalHandler.h @@ -15,7 +15,7 @@ public: namespace SignalHandler { - typedef void (*handler)( int, siginfo_t *si, const ucontext_t *uc ); + typedef bool (*handler)( int, siginfo_t *si, const ucontext_t *uc ); void OnClose( handler ); void ResetSignalHandlers();