diff options
| author | Oz Linden <oz@lindenlab.com> | 2013-06-03 17:49:51 -0400 | 
|---|---|---|
| committer | Oz Linden <oz@lindenlab.com> | 2013-06-03 17:49:51 -0400 | 
| commit | dd2ede9991a9a31821fbe43a7fa17a5aafa19542 (patch) | |
| tree | 9bc024d6a9a5b3cdcda7b40048f4c207edc3408d | |
| parent | f3def8fce601bb29634667ab215cc5f00408ffa9 (diff) | |
Fix and organize code for managing marker files that detect last_exec_event and last_exec_duration
| -rwxr-xr-x | indra/newview/llappviewer.cpp | 383 | ||||
| -rwxr-xr-x | indra/newview/llappviewer.h | 5 | 
2 files changed, 214 insertions, 174 deletions
| diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 4fb0ea8052..f92274dbbd 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -127,9 +127,9 @@  #if LL_WINDOWS -#	include <share.h> // For _SH_DENYWR in initMarkerFile +#	include <share.h> // For _SH_DENYWR in processMarkerFiles  #else -#   include <sys/file.h> // For initMarkerFile support +#   include <sys/file.h> // For processMarkerFiles  #endif  #include "llapr.h" @@ -742,8 +742,10 @@ bool LLAppViewer::init()  	// this allows simple skinned file lookups to work  	gDirUtilp->setSkinFolder("default", "en"); -	initLogging(); +	initLoggingAndGetLastDuration(); +	processMarkerFiles(); +  	//  	// OK to write stuff to logs now, we've now crash reported if necessary  	// @@ -766,7 +768,7 @@ bool LLAppViewer::init()  	logdir += gDirUtilp->getDirDelimiter();  	setMiniDumpDir(logdir); -	// Although initLogging() is the right place to mess with +	// Although initLoggingAndGetLastDuration() is the right place to mess with  	// setFatalFunction(), we can't query gSavedSettings until after  	// initConfiguration().  	S32 rc(gSavedSettings.getS32("QAModeTermCode")); @@ -2128,7 +2130,7 @@ void errorCallback(const std::string &error_string)  	LLError::crashAndLoop(error_string);  } -void LLAppViewer::initLogging() +void LLAppViewer::initLoggingAndGetLastDuration()  {  	//  	// Set up logging defaults for the viewer @@ -2153,24 +2155,35 @@ void LLAppViewer::initLogging()  	std::string start_marker_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, START_MARKER_FILE_NAME);  	llstat start_marker_stat;  	llstat log_file_stat; -	if (   0 == LLFile::stat(start_marker_file_name, &start_marker_stat) -		&& 0 == LLFile::stat(log_file, &log_file_stat) -		) +	std::ostringstream duration_log_stream; // can't log yet, so save any message for when we can below +	int start_stat_result = LLFile::stat(start_marker_file_name, &start_marker_stat); +	int log_stat_result = LLFile::stat(log_file, &log_file_stat); +	if ( 0 == start_stat_result && 0 == log_stat_result )  	{  		int elapsed_seconds = log_file_stat.st_ctime - start_marker_stat.st_ctime;  		// only report a last run time if the last viewer was the same version  		// because this stat will be counted against this version -		gLastExecDuration = markerIsSameVersion(start_marker_file_name) ? elapsed_seconds : -1; +		if ( markerIsSameVersion(start_marker_file_name) ) +		{ +			gLastExecDuration = elapsed_seconds; +		} +		else +		{ +			duration_log_stream << "start marker from some other version; duration is not reported"; +			gLastExecDuration = -1; +		}  	}  	else  	{  		// at least one of the LLFile::stat calls failed, so we can't compute the run time +		duration_log_stream << "duration stat failure; start: "<< start_stat_result << " log: " << log_stat_result;  		gLastExecDuration = -1; // unknown  	} +	std::string duration_log_msg(duration_log_stream.str());  	// Create a new start marker file for comparison with log file time for the next run  	LLAPRFile start_marker_file ; -	start_marker_file.open(start_marker_file_name, LL_APR_W); +	start_marker_file.open(start_marker_file_name, LL_APR_WB);  	if (start_marker_file.getFileHandle())  	{  		recordMarkerVersion(start_marker_file); @@ -2182,6 +2195,10 @@ void LLAppViewer::initLogging()  	// Set the log file to SecondLife.log  	LLError::logToFile(log_file); +	if (!duration_log_msg.empty()) +	{ +		LL_WARNS("MarkerFile") << duration_log_msg << LL_ENDL; +	}  }  bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, @@ -2756,38 +2773,35 @@ bool LLAppViewer::initConfiguration()  		}  	} -	    // -	    // Check for another instance of the app running -	    // -		mSecondInstance = anotherInstanceRunning(); +	// +	// Check for another instance of the app running +	//  	if (mSecondInstance && !gSavedSettings.getBOOL("AllowMultipleViewers")) -		{ -			std::ostringstream msg; -			msg << LLTrans::getString("MBAlreadyRunning"); -			OSMessageBox( -				msg.str(), -				LLStringUtil::null, -				OSMB_OK); -			return false; -		} +	{ +		std::ostringstream msg; +		msg << LLTrans::getString("MBAlreadyRunning"); +		OSMessageBox( +			msg.str(), +			LLStringUtil::null, +			OSMB_OK); +		return false; +	} -		initMarkerFile(); -         -		if (mSecondInstance) +	if (mSecondInstance) +	{ +		// This is the second instance of SL. Turn off voice support, +		// but make sure the setting is *not* persisted. +		LLControlVariable* disable_voice = gSavedSettings.getControl("CmdLineDisableVoice"); +		if(disable_voice)  		{ -			// This is the second instance of SL. Turn off voice support, -			// but make sure the setting is *not* persisted. -			LLControlVariable* disable_voice = gSavedSettings.getControl("CmdLineDisableVoice"); -			if(disable_voice) -			{ -				const BOOL DO_NOT_PERSIST = FALSE; -				disable_voice->setValue(LLSD(TRUE), DO_NOT_PERSIST); -			} +			const BOOL DO_NOT_PERSIST = FALSE; +			disable_voice->setValue(LLSD(TRUE), DO_NOT_PERSIST);  		} +	}  	else -        { -            checkForCrash(); -        } +	{ +		checkForCrash(); +	}     	// NextLoginLocation is set from the command line option  	std::string nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" ); @@ -3458,21 +3472,21 @@ void LLAppViewer::handleViewerCrash()  	//we're already in a crash situation	  	if (gDirUtilp)  	{ -		std::string crash_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, -																	 gLLErrorActivated -																	 ? LLERROR_MARKER_FILE_NAME -																	 : ERROR_MARKER_FILE_NAME); -		LLAPRFile crash_file ; -		crash_file.open(crash_file_name, LL_APR_W); -		if (crash_file.getFileHandle()) +		std::string crash_marker_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, +																			gLLErrorActivated +																			? LLERROR_MARKER_FILE_NAME +																			: ERROR_MARKER_FILE_NAME); +		LLAPRFile crash_marker_file ; +		crash_marker_file.open(crash_marker_file_name, LL_APR_WB); +		if (crash_marker_file.getFileHandle())  		{ -			LL_INFOS("MarkerFile") << "Created crash marker file " << crash_file_name << LL_ENDL; -			recordMarkerVersion(crash_file); +			LL_INFOS("MarkerFile") << "Created crash marker file " << crash_marker_file_name << LL_ENDL; +			recordMarkerVersion(crash_marker_file);  		}  		else  		{ -			LL_WARNS("MarkerFile") << "Cannot create error marker file " << crash_file_name << LL_ENDL; -		}		 +			LL_WARNS("MarkerFile") << "Cannot create error marker file " << crash_marker_file_name << LL_ENDL; +		}  	}  	else  	{ @@ -3523,38 +3537,6 @@ void LLAppViewer::handleViewerCrash()  	return;  } -bool LLAppViewer::anotherInstanceRunning() -{ -	// We create a marker file when the program starts and remove the file when it finishes. -	// If the file is currently locked, that means another process is already running. - -	std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, MARKER_FILE_NAME); -	LL_DEBUGS("MarkerFile") << "Checking marker file '"<< marker_file << "' for lock..." << LL_ENDL; - -	//Freeze case checks -	if (LLAPRFile::isExist(marker_file, NULL, LL_APR_RB)) -	{ -		// File exists, try opening with write permissions -		LLAPRFile outfile ; -		outfile.open(marker_file, LL_APR_AB); -		apr_file_t* fMarker = outfile.getFileHandle() ;  -		if (!fMarker) -		{ -			// Another instance is running. Skip the rest of these operations. -			LL_INFOS("MarkerFile") << "Marker file is locked." << LL_ENDL; -			return true; -		} -		if (apr_file_lock(fMarker, APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS) //flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1) -		{ -			LL_INFOS("MarkerFile") << "Marker file is locked." << LL_ENDL; -			return true; -		} -		// No other instances; we'll lock this file now & delete on quit.		 -	} -	LL_DEBUGS("MarkerFile") << "Marker file isn't locked." << LL_ENDL; -	return false; -} -  // static  void LLAppViewer::recordMarkerVersion(LLAPRFile& marker_file)   {		 @@ -3599,14 +3581,8 @@ bool LLAppViewer::markerIsSameVersion(const std::string& marker_name) const  	return sameVersion;  } -void LLAppViewer::initMarkerFile() +void LLAppViewer::processMarkerFiles()  { -	//First, check for the existence of other files. -	//There are marker files for two different types of crashes -	 -	mMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,MARKER_FILE_NAME); -	LL_DEBUGS("MarkerFile") << "Checking marker file for lock..." << LL_ENDL; -  	//We've got 4 things to test for here  	// - Other Process Running (SecondLife.exec_marker present, locked)  	// - Freeze (SecondLife.exec_marker present, not locked) @@ -3614,29 +3590,92 @@ void LLAppViewer::initMarkerFile()  	// - Other Crash (SecondLife.error_marker present)  	// These checks should also remove these files for the last 2 cases if they currently exist -	//LLError/Error checks. Only one of these should ever happen at a time. -	std::string logout_marker_file =  gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LOGOUT_MARKER_FILE_NAME); -	std::string llerror_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LLERROR_MARKER_FILE_NAME); -	std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME); - -	if (LLAPRFile::isExist(mMarkerFileName, NULL, LL_APR_RB) && !anotherInstanceRunning()) +	bool marker_is_same_version = true; +	// first, look for the marker created at startup and deleted on a clean exit +	mMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,MARKER_FILE_NAME); +	if (LLAPRFile::isExist(mMarkerFileName, NULL, LL_APR_RB))  	{ -		if ( markerIsSameVersion(mMarkerFileName) ) +		// File exists... +		// first, read it to see if it was created by the same version (we need this later) +		marker_is_same_version = markerIsSameVersion(mMarkerFileName); + +		// now test to see if this file is locked by a running process (try to open for write) +		LL_DEBUGS("MarkerFile") << "Checking exec marker file for lock..." << LL_ENDL; +		mMarkerFile.open(mMarkerFileName, LL_APR_WB); +		apr_file_t* fMarker = mMarkerFile.getFileHandle() ;  +		if (!fMarker)  		{ -			LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found" << LL_ENDL; -		gLastExecEvent = LAST_EXEC_FROZE; +			LL_INFOS("MarkerFile") << "Exec marker file open failed - assume it is locked." << LL_ENDL; +			mSecondInstance = true; // lock means that instance is running. +		} +		else +		{ +			// We were able to open it, now try to lock it ourselves... +			if (apr_file_lock(fMarker, APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS) +			{ +				LL_WARNS_ONCE("MarkerFile") << "Locking exec marker failed." << LL_ENDL; +				mSecondInstance = true; // lost a race? be conservative +			} +			else +			{ +				// No other instances; we've locked this file now, so record our version; delete on quit.		 +				recordMarkerVersion(mMarkerFile); +				LL_DEBUGS("MarkerFile") << "Exec marker file existed but was not locked; rewritten." << LL_ENDL; +			} +		} + +		if (mSecondInstance) +		{ +			LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' owned by another instance" << LL_ENDL; +		} +		else if (marker_is_same_version) +		{ +			// the file existed, is ours, and matched our version, so we can report on what it says +			LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found; last exec FROZE" << LL_ENDL; +			gLastExecEvent = LAST_EXEC_FROZE; +				  		}  		else  		{  			LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found, but versions did not match" << LL_ENDL;  		} -	}     +	} +	else // marker did not exist... last exec (if any) did not freeze +	{ +		// Create the marker file for this execution & lock it; it will be deleted on a clean exit +		apr_status_t s; +		s = mMarkerFile.open(mMarkerFileName, LL_APR_WB, TRUE);	 + +		if (s == APR_SUCCESS && mMarkerFile.getFileHandle()) +		{ +			LL_DEBUGS("MarkerFile") << "Exec marker file '"<< mMarkerFileName << "' created." << LL_ENDL; +			if (APR_SUCCESS == apr_file_lock(mMarkerFile.getFileHandle(), APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE))  +			{ +				recordMarkerVersion(mMarkerFile); +				LL_DEBUGS("MarkerFile") << "Exec marker file locked." << LL_ENDL; +			} +			else +			{ +				LL_WARNS("MarkerFile") << "Exec marker file cannot be locked." << LL_ENDL; +			} +		} +		else +		{ +			LL_WARNS("MarkerFile") << "Failed to create exec marker file '"<< mMarkerFileName << "'." << LL_ENDL; +		} +	} + +	// now check for cases in which the exec marker may have been cleaned up by crash handlers + +	// check for any last exec event report based on whether or not it happened during logout +	// (the logout marker is created when logout begins) +	std::string logout_marker_file =  gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LOGOUT_MARKER_FILE_NAME);  	if(LLAPRFile::isExist(logout_marker_file, NULL, LL_APR_RB))  	{  		if (markerIsSameVersion(logout_marker_file))  		{ -		gLastExecEvent = LAST_EXEC_LOGOUT_FROZE; -			LL_INFOS("MarkerFile") << "Logout crashed '"<< logout_marker_file << "', setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +			gLastExecEvent = LAST_EXEC_LOGOUT_FROZE; +			LL_INFOS("MarkerFile") << "Logout crash marker '"<< logout_marker_file << "', changing LastExecEvent to LOGOUT_FROZE" << LL_ENDL;  		}  		else  		{ @@ -3644,89 +3683,86 @@ void LLAppViewer::initMarkerFile()  		}  		LLAPRFile::remove(logout_marker_file);  	} +	// further refine based on whether or not a marker created during an llerr crash is found +	std::string llerror_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LLERROR_MARKER_FILE_NAME);  	if(LLAPRFile::isExist(llerror_marker_file, NULL, LL_APR_RB))  	{  		if (markerIsSameVersion(llerror_marker_file))  		{ -			gLastExecEvent = ( gLastExecEvent == LAST_EXEC_LOGOUT_FROZE ) -				? LAST_EXEC_LOGOUT_CRASH : LAST_EXEC_LLERROR_CRASH; -			LL_INFOS("MarkerFile") << "Last exec LLError '"<< llerror_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +			if ( gLastExecEvent == LAST_EXEC_LOGOUT_FROZE ) +			{ +				gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; +				LL_INFOS("MarkerFile") << "LLError marker '"<< llerror_marker_file << "' crashed, setting LastExecEvent to LOGOUT_CRASH" << LL_ENDL; +			} +			else +			{ +				gLastExecEvent = LAST_EXEC_LLERROR_CRASH; +				LL_INFOS("MarkerFile") << "LLError marker '"<< llerror_marker_file << "' crashed, setting LastExecEvent to LLERROR_CRASH" << LL_ENDL; +			}  		}  		else  		{ -			LL_INFOS("MarkerFile") << "Last exec LLError marker '"<< llerror_marker_file << "' found, but versions did not match" << LL_ENDL; +			LL_INFOS("MarkerFile") << "LLError marker '"<< llerror_marker_file << "' found, but versions did not match" << LL_ENDL;  		}  		LLAPRFile::remove(llerror_marker_file);  	} +	// and last refine based on whether or not a marker created during a non-llerr crash is found +	std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME);  	if(LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB))  	{  		if (markerIsSameVersion(error_marker_file))  		{ -			gLastExecEvent = (gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) -				? LAST_EXEC_LOGOUT_CRASH : LAST_EXEC_OTHER_CRASH; -			LL_INFOS("MarkerFile") << "Last exec '"<< error_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +			if (gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) +			{ +				gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; +				LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' crashed, setting LastExecEvent to LOGOUT_CRASH" << LL_ENDL; +			} +			else +			{ +				gLastExecEvent = LAST_EXEC_OTHER_CRASH; +				LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +			}  		}  		else  		{ -			LL_INFOS("MarkerFile") << "Last exec '"<< error_marker_file << "' marker found, but versions did not match" << LL_ENDL; +			LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' marker found, but versions did not match" << LL_ENDL;  		}  		LLAPRFile::remove(error_marker_file);  	} - -	// No new markers if another instance is running. -	if(anotherInstanceRunning())  -	{ -		return; -	} -	 -	// Create the marker file for this execution & lock it -	apr_status_t s; -	s = mMarkerFile.open(mMarkerFileName, LL_APR_W, TRUE);	 - -	if (s == APR_SUCCESS && mMarkerFile.getFileHandle()) -	{ -		LL_DEBUGS("MarkerFile") << "Marker file '"<< mMarkerFileName << "' created." << LL_ENDL; -		if (APR_SUCCESS == apr_file_lock(mMarkerFile.getFileHandle(), APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE))  -		{ -			recordMarkerVersion(mMarkerFile); -			LL_DEBUGS("MarkerFile") << "Marker file locked." << LL_ENDL; -	} -	else -	{ -			LL_INFOS("MarkerFile") << "Marker file cannot be locked." << LL_ENDL; -		} -	} -	else -	{ -		LL_INFOS("MarkerFile") << "Failed to create marker file '"<< mMarkerFileName << "'." << LL_ENDL; -	}  }  void LLAppViewer::removeMarkerFile(bool leave_logout_marker)  { -	LL_DEBUGS("MarkerFile") << "removeMarkerFile("<<(leave_logout_marker?"leave":"remove") <<" logout)" << LL_ENDL; -	if (mMarkerFile.getFileHandle()) -	{ -		LL_DEBUGS("MarkerFile") << "removeMarkerFile marker '"<<mMarkerFileName<<"'"<< LL_ENDL; -		mMarkerFile.close() ; -		LLAPRFile::remove( mMarkerFileName ); -	} -	else -	{ -		LL_WARNS("MarkerFile") << "removeMarkerFile marker '"<<mMarkerFileName<<"' not open"<< LL_ENDL; -	} -	if (!leave_logout_marker) -	{ -		if (mLogoutMarkerFile.getFileHandle()) +	if (!mSecondInstance) +	{		 +		LL_DEBUGS("MarkerFile") << (leave_logout_marker?"leave":"remove") <<" logout" << LL_ENDL; +		if (mMarkerFile.getFileHandle())  		{ -			LL_DEBUGS("MarkerFile") << "removeMarkerFile logout marker '"<<mLogoutMarkerFileName<<"'"<< LL_ENDL; -			mLogoutMarkerFile.close(); +			LL_DEBUGS("MarkerFile") << "removing exec marker '"<<mMarkerFileName<<"'"<< LL_ENDL; +			mMarkerFile.close() ; +			LLAPRFile::remove( mMarkerFileName );  		}  		else -	{ -			LL_WARNS("MarkerFile") << "removeMarkerFile logout marker '"<<mLogoutMarkerFileName<<"' not open"<< LL_ENDL; +		{ +			LL_WARNS("MarkerFile") << "marker '"<<mMarkerFileName<<"' not open"<< LL_ENDL; +		} +		if (!leave_logout_marker) +		{ +			if (mLogoutMarkerFile.getFileHandle()) +			{ +				LL_DEBUGS("MarkerFile") << "removing logout marker '"<<mLogoutMarkerFileName<<"'"<< LL_ENDL; +				mLogoutMarkerFile.close(); +			} +			else +			{ +				LL_WARNS("MarkerFile") << "logout marker '"<<mLogoutMarkerFileName<<"' not open"<< LL_ENDL; +			} +			LLAPRFile::remove( mLogoutMarkerFileName );  		} -		LLAPRFile::remove( mLogoutMarkerFileName ); +	} +	else +	{ +		LL_WARNS("MarkerFile") << "leaving markers because this is a second instance" << LL_ENDL;  	}  } @@ -4925,6 +4961,22 @@ void LLAppViewer::sendLogoutRequest()  {  	if(!mLogoutRequestSent && gMessageSystem)  	{ +		//Set internal status variables and marker files before actually starting the logout process +		gLogoutInProgress = TRUE; +		mLogoutMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LOGOUT_MARKER_FILE_NAME); +		 +		LLAPRFile outfile ; +		mLogoutMarkerFile.open(mLogoutMarkerFileName, LL_APR_WB); +		if (mLogoutMarkerFile.getFileHandle()) +		{ +			LL_INFOS("MarkerFile") << "Created logout marker file '"<< mLogoutMarkerFileName << "' " << LL_ENDL; +			recordMarkerVersion(outfile); +		} +		else +		{ +			LL_WARNS("MarkerFile") << "Cannot create logout marker file " << mLogoutMarkerFileName << LL_ENDL; +		}		 +  		LLMessageSystem* msg = gMessageSystem;  		msg->newMessageFast(_PREHASH_LogoutRequest);  		msg->nextBlockFast(_PREHASH_AgentData); @@ -4940,22 +4992,6 @@ void LLAppViewer::sendLogoutRequest()  		{  			LLVoiceClient::getInstance()->leaveChannel();  		} - -		//Set internal status variables and marker files -		gLogoutInProgress = TRUE; -		mLogoutMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LOGOUT_MARKER_FILE_NAME); -		 -		LLAPRFile outfile ; -		mLogoutMarkerFile.open(mLogoutMarkerFileName, LL_APR_W); -		if (mLogoutMarkerFile.getFileHandle()) -		{ -			LL_INFOS("MarkerFile") << "Created logout marker file '"<< mLogoutMarkerFileName << "' " << mLogoutMarkerFileName << LL_ENDL; -			recordMarkerVersion(outfile); -		} -		else -		{ -			LL_WARNS("MarkerFile") << "Cannot create logout marker file " << mLogoutMarkerFileName << LL_ENDL; -		}		  	}  } @@ -5204,11 +5240,12 @@ void LLAppViewer::disconnectViewer()  void LLAppViewer::forceErrorLLError()  { -   	llerrs << "This is an llerror" << llendl; +   	llerrs << "This is a deliberate llerror" << llendl;  }  void LLAppViewer::forceErrorBreakpoint()  { +   	llwarns << "Forcing a deliberate breakpoint" << llendl;  #ifdef LL_WINDOWS      DebugBreak();  #endif @@ -5217,6 +5254,7 @@ void LLAppViewer::forceErrorBreakpoint()  void LLAppViewer::forceErrorBadMemoryAccess()  { +   	llwarns << "Forcing a deliberate bad memory access" << llendl;      S32* crash = NULL;      *crash = 0xDEADBEEF;        return; @@ -5224,6 +5262,7 @@ void LLAppViewer::forceErrorBadMemoryAccess()  void LLAppViewer::forceErrorInfiniteLoop()  { +   	llwarns << "Forcing a deliberate infinite loop" << llendl;      while(true)      {          ; @@ -5233,12 +5272,14 @@ void LLAppViewer::forceErrorInfiniteLoop()  void LLAppViewer::forceErrorSoftwareException()  { +   	llwarns << "Forcing a deliberate exception" << llendl;      // *FIX: Any way to insure it won't be handled?      throw;   }  void LLAppViewer::forceErrorDriverCrash()  { +   	llwarns << "Forcing a deliberate driver crash" << llendl;  	glDeleteTextures(1, NULL);  } diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index d3a8cf24d9..cd91ae8b2b 100755 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -183,7 +183,7 @@ public:  protected:  	virtual bool initWindow(); // Initialize the viewer's window. -	virtual void initLogging(); // Initialize log files, logging system +	virtual void initLoggingAndGetLastDuration(); // Initialize log files, logging system  	virtual void initConsole() {}; // Initialize OS level debugging console.  	virtual bool initHardwareTest() { return true; } // A false result indicates the app should quit.  	virtual bool initSLURLHandler(); @@ -215,8 +215,7 @@ private:  	void writeSystemInfo(); // Write system info to "debug_info.log" -	bool anotherInstanceRunning();  -	void initMarkerFile();  +	void processMarkerFiles();   	static void recordMarkerVersion(LLAPRFile& marker_file);  	bool markerIsSameVersion(const std::string& marker_name) const; | 
