From 1522c1b3bdc8eca4acd23f92dfce118121721038 Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Tue, 10 Dec 2013 15:48:57 -0800 Subject: SH-4653 FIX Interesting: Viewer crashes while reading chat history fix for crash on exit resulting from 8c0e024d0c33 --- indra/llcommon/llthread.cpp | 14 ++++++++++++-- indra/llcommon/lltracethreadrecorder.cpp | 12 ++++++------ indra/llcommon/lltracethreadrecorder.h | 4 ++-- 3 files changed, 20 insertions(+), 10 deletions(-) (limited to 'indra/llcommon') 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 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; }; -- cgit v1.2.3