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) )
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)
+16 -1
View File
@@ -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 )
+1 -1
View File
@@ -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();