fix crashes in crash handler being handled by DoCleanShutdown

This commit is contained in:
Glenn Maynard
2007-01-24 11:38:29 +00:00
parent 2f8079fae9
commit 0b26020d96
3 changed files with 26 additions and 8 deletions
@@ -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) ) if( IsFatalSignal(signal) )
return; return false;
/* ^C. */ /* ^C. */
ArchHooks::SetUserQuit(); ArchHooks::SetUserQuit();
return true;
} }
#if defined(CRASH_HANDLER) #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. */ /* Don't dump a debug file if the user just hit ^C. */
if( !IsFatalSignal(signal) ) if( !IsFatalSignal(signal) )
return; return true;
CrashHandler::CrashSignalHandler( signal, si, uc ); CrashHandler::CrashSignalHandler( signal, si, uc );
return false;
} }
#endif #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) ) if( !IsFatalSignal(signal) )
return; return false;
DoEmergencyShutdown(); DoEmergencyShutdown();
@@ -68,6 +70,7 @@ static void EmergencyShutdown( int signal, siginfo_t *si, const ucontext_t *uc )
SignalHandler::ResetSignalHandlers(); SignalHandler::ResetSignalHandlers();
raise( signal ); raise( signal );
#endif #endif
return false;
} }
#if defined(HAVE_TLS) #if defined(HAVE_TLS)
+16 -1
View File
@@ -71,8 +71,23 @@ SaveSignals::~SaveSignals()
static void SigHandler( int signal, siginfo_t *si, void *ucp ) static void SigHandler( int signal, siginfo_t *si, void *ucp )
{ {
bool bMaskSignal = false;
for( unsigned i = 0; i < handlers.size(); ++i ) 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 ) int find_stack_direction2( char *p )
+1 -1
View File
@@ -15,7 +15,7 @@ public:
namespace SignalHandler 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 OnClose( handler );
void ResetSignalHandlers(); void ResetSignalHandlers();