diff options
| author | Richard Linden <none@none> | 2013-12-10 15:48:57 -0800 | 
|---|---|---|
| committer | Richard Linden <none@none> | 2013-12-10 15:48:57 -0800 | 
| commit | 1522c1b3bdc8eca4acd23f92dfce118121721038 (patch) | |
| tree | c7e7b3ec9d6a076db51d57992f9c6a36b12abb4b /indra/llcommon | |
| parent | 0b40ee53e3d898990826f5d48ec1deecf3c05062 (diff) | |
SH-4653 FIX Interesting: Viewer crashes while reading chat history
fix for crash on exit resulting from 8c0e024d0c33
Diffstat (limited to 'indra/llcommon')
| -rwxr-xr-x | indra/llcommon/llthread.cpp | 14 | ||||
| -rw-r--r-- | indra/llcommon/lltracethreadrecorder.cpp | 12 | ||||
| -rw-r--r-- | indra/llcommon/lltracethreadrecorder.h | 4 | 
3 files changed, 20 insertions, 10 deletions
| diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp index 3e3c876a54..cf7768c67b 100755 --- a/indra/llcommon/llthread.cpp +++ b/indra/llcommon/llthread.cpp @@ -146,6 +146,9 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap  	// We're done with the run function, this thread is done executing now.  	threadp->mStatus = STOPPED; +	delete threadp->mRecorder; +	threadp->mRecorder = NULL; +  	return NULL;  } @@ -153,7 +156,8 @@ LLThread::LLThread(const std::string& name, apr_pool_t *poolp) :  	mPaused(FALSE),  	mName(name),  	mAPRThreadp(NULL), -	mStatus(STOPPED) +	mStatus(STOPPED), +	mRecorder(NULL)  {  	mID = ++sIDIter; @@ -242,7 +246,13 @@ void LLThread::shutdown()  		mAPRPoolp = 0;  	} -	delete mRecorder; +	if (mRecorder) +	{ +		// missed chance to properly shut down recorder (needs to be done in thread context) +		// probably due to abnormal thread termination +		// so just leak it and remove it from parent +		LLTrace::get_master_thread_recorder()->removeChildRecorder(mRecorder); +	}  } diff --git a/indra/llcommon/lltracethreadrecorder.cpp b/indra/llcommon/lltracethreadrecorder.cpp index d62fabe3df..a14a8ff035 100644 --- a/indra/llcommon/lltracethreadrecorder.cpp +++ b/indra/llcommon/lltracethreadrecorder.cpp @@ -40,7 +40,7 @@ static ThreadRecorder* sMasterThreadRecorder = NULL;  ///////////////////////////////////////////////////////////////////////  ThreadRecorder::ThreadRecorder() -:	mMasterRecorder(NULL) +:	mParentRecorder(NULL)  {  	init();  } @@ -86,11 +86,11 @@ void ThreadRecorder::init()  } -ThreadRecorder::ThreadRecorder( ThreadRecorder& master ) -:	mMasterRecorder(&master) +ThreadRecorder::ThreadRecorder( ThreadRecorder& parent ) +:	mParentRecorder(&parent)  {  	init(); -	mMasterRecorder->addChildRecorder(this); +	mParentRecorder->addChildRecorder(this);  } @@ -115,9 +115,9 @@ ThreadRecorder::~ThreadRecorder()  	set_thread_recorder(NULL);  	delete[] mTimeBlockTreeNodes; -	if (mMasterRecorder) +	if (mParentRecorder)  	{ -		mMasterRecorder->removeChildRecorder(this); +		mParentRecorder->removeChildRecorder(this);  	}  } diff --git a/indra/llcommon/lltracethreadrecorder.h b/indra/llcommon/lltracethreadrecorder.h index d30fa15ea7..a797c6687e 100644 --- a/indra/llcommon/lltracethreadrecorder.h +++ b/indra/llcommon/lltracethreadrecorder.h @@ -43,7 +43,7 @@ namespace LLTrace  		typedef std::vector<ActiveRecording*> active_recording_list_t;  	public:  		ThreadRecorder(); -		explicit ThreadRecorder(ThreadRecorder& master); +		explicit ThreadRecorder(ThreadRecorder& parent);  		~ThreadRecorder(); @@ -88,7 +88,7 @@ namespace LLTrace  		LLMutex							mChildListMutex;		// protects access to child list  		LLMutex							mSharedRecordingMutex;  		AccumulatorBufferGroup			mSharedRecordingBuffers; -		ThreadRecorder*					mMasterRecorder; +		ThreadRecorder*					mParentRecorder;  	}; | 
