diff options
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/llapp.cpp | 32 | ||||
| -rw-r--r-- | indra/llcommon/llapp.h | 6 | 
2 files changed, 38 insertions, 0 deletions
| diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index eebd5ed0a6..39daefd1ad 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -90,6 +90,10 @@ S32 LL_HEARTBEAT_SIGNAL = (SIGRTMAX >= 0) ? (SIGRTMAX-0) : SIGUSR2;  // the static application instance  LLApp* LLApp::sApplication = NULL; +// Allows the generation of core files for post mortem under gdb +// and disables crashlogger +BOOL LLApp::sDisableCrashlogger = FALSE;  +  // Local flag for whether or not to do logging in signal handlers.  //static  BOOL LLApp::sLogInSignal = FALSE; @@ -461,11 +465,30 @@ bool LLApp::isQuitting()  	return (APP_STATUS_QUITTING == sStatus);  } +// static  bool LLApp::isExiting()  {  	return isQuitting() || isError();  } +void LLApp::disableCrashlogger() +{ +	// Disable Breakpad exception handler. +	if (mExceptionHandler != 0) +	{ +		delete mExceptionHandler; +		mExceptionHandler = 0; +	} + +	sDisableCrashlogger = TRUE; +} + +// static +bool LLApp::isCrashloggerDisabled() +{ +	return (sDisableCrashlogger == TRUE);  +} +  #if !LL_WINDOWS  // static  U32 LLApp::getSigChildCount() @@ -799,6 +822,15 @@ void default_unix_signal_handler(int signum, siginfo_t *info, void *)  			{  				llwarns << "Signal handler - Flagging error status and waiting for shutdown" << llendl;  			} +									 +			if (LLApp::isCrashloggerDisabled())	// Don't gracefully handle any signal, crash and core for a gdb post mortem +			{ +				clear_signals(); +				llwarns << "Fatal signal received, not handling the crash here, passing back to operating system" << llendl; +				raise(signum); +				return; +			}		 +			  			// Flag status to ERROR, so thread_error does its work.  			LLApp::setError();  			// Block in the signal handler until somebody says that we're done. diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index ee1d696829..a536a06ea5 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -189,6 +189,11 @@ public:  	//  	virtual bool mainLoop() = 0; // Override for the application main loop.  Needs to at least gracefully notice the QUITTING state and exit. +	// +	// Crash logging +	// +	void disableCrashlogger();				// Let the OS handle the crashes +	static bool isCrashloggerDisabled();	// Get the here above set value  	//  	// Application status @@ -280,6 +285,7 @@ protected:  	static void setStatus(EAppStatus status);		// Use this to change the application status.  	static EAppStatus sStatus; // Reflects current application status  	static BOOL sErrorThreadRunning; // Set while the error thread is running +	static BOOL sDisableCrashlogger; // Let the OS handle crashes for us.  #if !LL_WINDOWS  	static LLAtomicU32* sSigChildCount; // Number of SIGCHLDs received. | 
