From b31bfdba37398e3100e8e209d407cea6065ce52a Mon Sep 17 00:00:00 2001 From: Stinson Linden Date: Sat, 26 Apr 2014 01:47:41 +0100 Subject: MAINT-4009: Converting the Globals class within llerror to be derived from LLSingleton so that it may be cleaned up properly on app exit. --- indra/llcommon/llerror.cpp | 88 ++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 53 deletions(-) diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index a7963174ad..a3053617d3 100755 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -47,6 +47,7 @@ #include "lllivefile.h" #include "llsd.h" #include "llsdserialize.h" +#include "llsingleton.h" #include "llstl.h" #include "lltimer.h" @@ -359,27 +360,28 @@ namespace typedef std::vector Recorders; typedef std::vector CallSiteVector; - class Globals + class Globals : public LLSingleton { public: + Globals(); + std::ostringstream messageStream; bool messageStreamInUse; void addCallSite(LLError::CallSite&); void invalidateCallSites(); - - static Globals& get(); - // return the one instance of the globals private: CallSiteVector callSites; - - Globals() - : messageStreamInUse(false) - { } - }; + Globals::Globals() + : messageStream(), + messageStreamInUse(false), + callSites() + { + } + void Globals::addCallSite(LLError::CallSite& site) { callSites.push_back(&site); @@ -396,18 +398,6 @@ namespace callSites.clear(); } - - Globals& Globals::get() - { - /* This pattern, of returning a reference to a static function - variable, is to ensure that this global is constructed before - it is used, no matter what the global initialization sequence - is. - See C++ FAQ Lite, sections 10.12 through 10.14 - */ - static Globals* globals = new Globals; - return *globals; - } } namespace LLError @@ -474,7 +464,7 @@ namespace LLError void Settings::reset() { - Globals::get().invalidateCallSites(); + Globals::getInstance()->invalidateCallSites(); Settings*& p = getPtr(); delete p; @@ -483,7 +473,7 @@ namespace LLError Settings* Settings::saveAndReset() { - Globals::get().invalidateCallSites(); + Globals::getInstance()->invalidateCallSites(); Settings*& p = getPtr(); Settings* originalSettings = p; @@ -493,7 +483,7 @@ namespace LLError void Settings::restore(Settings* originalSettings) { - Globals::get().invalidateCallSites(); + Globals::getInstance()->invalidateCallSites(); Settings*& p = getPtr(); delete p; @@ -680,9 +670,8 @@ namespace LLError void setDefaultLevel(ELevel level) { - Globals& g = Globals::get(); + Globals::getInstance()->invalidateCallSites(); Settings& s = Settings::get(); - g.invalidateCallSites(); s.mDefaultLevel = level; } @@ -694,33 +683,29 @@ namespace LLError void setFunctionLevel(const std::string& function_name, ELevel level) { - Globals& g = Globals::get(); + Globals::getInstance()->invalidateCallSites(); Settings& s = Settings::get(); - g.invalidateCallSites(); s.mFunctionLevelMap[function_name] = level; } void setClassLevel(const std::string& class_name, ELevel level) { - Globals& g = Globals::get(); + Globals::getInstance()->invalidateCallSites(); Settings& s = Settings::get(); - g.invalidateCallSites(); s.mClassLevelMap[class_name] = level; } void setFileLevel(const std::string& file_name, ELevel level) { - Globals& g = Globals::get(); + Globals::getInstance()->invalidateCallSites(); Settings& s = Settings::get(); - g.invalidateCallSites(); s.mFileLevelMap[file_name] = level; } void setTagLevel(const std::string& tag_name, ELevel level) { - Globals& g = Globals::get(); + Globals::getInstance()->invalidateCallSites(); Settings& s = Settings::get(); - g.invalidateCallSites(); s.mTagLevelMap[tag_name] = level; } @@ -765,10 +750,9 @@ namespace LLError { void configure(const LLSD& config) { - Globals& g = Globals::get(); + Globals::getInstance()->invalidateCallSites(); Settings& s = Settings::get(); - g.invalidateCallSites(); s.mFunctionLevelMap.clear(); s.mClassLevelMap.clear(); s.mFileLevelMap.clear(); @@ -1060,7 +1044,6 @@ namespace LLError return false; } - Globals& g = Globals::get(); Settings& s = Settings::get(); s.mShouldLogCallCounter++; @@ -1091,7 +1074,7 @@ namespace LLError : false); site.mCached = true; - g.addCallSite(site); + Globals::getInstance()->addCallSite(site); return site.mShouldLog = site.mLevel >= compareLevel; } @@ -1101,12 +1084,12 @@ namespace LLError LogLock lock; if (lock.ok()) { - Globals& g = Globals::get(); + Globals* g = Globals::getInstance(); - if (!g.messageStreamInUse) + if (!g->messageStreamInUse) { - g.messageStreamInUse = true; - return &g.messageStream; + g->messageStreamInUse = true; + return &g->messageStream; } } @@ -1131,13 +1114,12 @@ namespace LLError message[127] = '\0' ; } - Globals& g = Globals::get(); - - if (out == &g.messageStream) + Globals* g = Globals::getInstance(); + if (out == &g->messageStream) { - g.messageStream.clear(); - g.messageStream.str(""); - g.messageStreamInUse = false; + g->messageStream.clear(); + g->messageStream.str(""); + g->messageStreamInUse = false; } else { @@ -1154,15 +1136,15 @@ namespace LLError return; } - Globals& g = Globals::get(); + Globals* g = Globals::getInstance(); Settings& s = Settings::get(); std::string message = out->str(); - if (out == &g.messageStream) + if (out == &g->messageStream) { - g.messageStream.clear(); - g.messageStream.str(""); - g.messageStreamInUse = false; + g->messageStream.clear(); + g->messageStream.str(""); + g->messageStreamInUse = false; } else { -- cgit v1.2.3