diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2020-11-16 22:11:19 +0200 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2020-11-16 22:11:35 +0200 | 
| commit | 52c0776afdcd75ba8ebadc6b45d8611564e3b833 (patch) | |
| tree | 093eff19064343b59a67a73bfa0a04d53c91f9fc | |
| parent | 0812d81e7b64ef80f7ca832f7110f43f1ce9ff33 (diff) | |
SL-14340 Fix crash on llerror's recorders
| -rw-r--r-- | indra/llcommon/llerror.cpp | 21 | 
1 files changed, 15 insertions, 6 deletions
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index 781c41f3de..012ec08f07 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -458,6 +458,7 @@ namespace          LLError::TimeFunction               mTimeFunction;          Recorders                           mRecorders; +        LLMutex                             mRecorderMutex;          int                                 mShouldLogCallCounter; @@ -480,6 +481,7 @@ namespace          mCrashFunction(NULL),          mTimeFunction(NULL),          mRecorders(), +        mRecorderMutex(),          mShouldLogCallCounter(0)      {      } @@ -999,6 +1001,7 @@ namespace LLError  			return;  		}  		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig(); +		LLMutexLock lock(&s->mRecorderMutex);  		s->mRecorders.push_back(recorder);  	} @@ -1009,6 +1012,7 @@ namespace LLError  			return;  		}  		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig(); +		LLMutexLock lock(&s->mRecorderMutex);  		s->mRecorders.erase(std::remove(s->mRecorders.begin(), s->mRecorders.end(), recorder),  							s->mRecorders.end());  	} @@ -1020,11 +1024,12 @@ namespace LLError      // with a Recorders::iterator indicating the position of that entry in      // mRecorders. The shared_ptr might be empty (operator!() returns true) if      // there was no such RECORDER subclass instance in mRecorders. +    // +    // NOTE!!! Requires external mutex lock!!!      template <typename RECORDER>      std::pair<boost::shared_ptr<RECORDER>, Recorders::iterator> -    findRecorderPos() +    findRecorderPos(SettingsConfigPtr &s)      { -        SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();          // Since we promise to return an iterator, use a classic iterator          // loop.          auto end{s->mRecorders.end()}; @@ -1055,7 +1060,9 @@ namespace LLError      template <typename RECORDER>      boost::shared_ptr<RECORDER> findRecorder()      { -        return findRecorderPos<RECORDER>().first; +        SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig(); +        LLMutexLock lock(&s->mRecorderMutex); +        return findRecorderPos<RECORDER>(s).first;      }      // Remove an entry from SettingsConfig::mRecorders whose RecorderPtr @@ -1064,10 +1071,11 @@ namespace LLError      template <typename RECORDER>      bool removeRecorder()      { -        auto found = findRecorderPos<RECORDER>(); +        SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig(); +        LLMutexLock lock(&s->mRecorderMutex); +        auto found = findRecorderPos<RECORDER>(s);          if (found.first)          { -            SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();              s->mRecorders.erase(found.second);          }          return bool(found.first); @@ -1168,7 +1176,8 @@ namespace  		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();          std::string escaped_message; -         + +        LLMutexLock lock(&s->mRecorderMutex);  		for (Recorders::const_iterator i = s->mRecorders.begin();  			i != s->mRecorders.end();  			++i)  | 
