diff options
| author | Dave Houlton <euclid@lindenlab.com> | 2021-11-16 11:44:55 -0700 | 
|---|---|---|
| committer | Dave Houlton <euclid@lindenlab.com> | 2021-11-16 11:44:55 -0700 | 
| commit | 353329c2c2e9e8fa1ff273de2016c9e155585f45 (patch) | |
| tree | f5098b9532f6d7b757b9a8fb345e7aa5e7e69108 /indra/llcommon | |
| parent | e95b7efd0b4469ce18bce3bc0261ecc9be06ea9c (diff) | |
| parent | 9957c28ddc5e5c129af2db662da7d69f1509af65 (diff) | |
DRTVWR-546 merge in master v6.5.1
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/llcommon/llcoros.cpp | 9 | ||||
| -rw-r--r-- | indra/llcommon/llcoros.h | 2 | ||||
| -rw-r--r-- | indra/llcommon/llerror.cpp | 290 | ||||
| -rw-r--r-- | indra/llcommon/llevents.cpp | 19 | ||||
| -rw-r--r-- | indra/llcommon/llevents.h | 14 | ||||
| -rw-r--r-- | indra/llcommon/llregex.h | 89 | ||||
| -rw-r--r-- | indra/llcommon/llsys.cpp | 39 | 
8 files changed, 262 insertions, 202 deletions
| diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index ad6d3a5049..9defa6b6c1 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -213,9 +213,9 @@ set(llcommon_HEADER_FILES      llqueuedthread.h      llrand.h      llrefcount.h +    llregex.h      llregistry.h      llrun.h -    llrefcount.h      llsafehandle.h      llsd.h      llsdjson.h diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp index 111c50af93..75fc0fec99 100644 --- a/indra/llcommon/llcoros.cpp +++ b/indra/llcommon/llcoros.cpp @@ -135,6 +135,13 @@ LLCoros::LLCoros():  LLCoros::~LLCoros()  { +} + +void LLCoros::cleanupSingleton() +{ +    // Some of the coroutines (like voice) will depend onto +    // origin singletons, so clean coros before deleting those +      printActiveCoroutines("at entry to ~LLCoros()");      // Other LLApp status-change listeners do things like close      // work queues and inject the Stop exception into pending @@ -150,6 +157,8 @@ LLCoros::~LLCoros()      {          // don't use llcoro::suspend() because that module depends          // on this one +        // This will yield current(main) thread and will let active +        // corutines run once          boost::this_fiber::yield();      }      printActiveCoroutines("after pumping"); diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index 6c0bec3ef9..a94cfca19f 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -89,6 +89,8 @@ class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>  {      LLSINGLETON(LLCoros);      ~LLCoros(); + +    void cleanupSingleton();  public:      /// The viewer's use of the term "coroutine" became deeply embedded before      /// the industry term "fiber" emerged to distinguish userland threads from diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index f7af181927..a4a5cb2d24 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -442,6 +442,62 @@ namespace  	typedef std::vector<LLError::RecorderPtr> Recorders;  	typedef std::vector<LLError::CallSite*> CallSiteVector; +    class SettingsConfig : public LLRefCount +    { +        friend class Globals; + +    public: +        virtual ~SettingsConfig(); + +        LLError::ELevel                     mDefaultLevel; + +        bool 								mLogAlwaysFlush; + +        U32 								mEnabledLogTypesMask; + +        LevelMap                            mFunctionLevelMap; +        LevelMap                            mClassLevelMap; +        LevelMap                            mFileLevelMap; +        LevelMap                            mTagLevelMap; +        std::map<std::string, unsigned int> mUniqueLogMessages; + +        LLError::FatalFunction              mCrashFunction; +        LLError::TimeFunction               mTimeFunction; + +        Recorders                           mRecorders; +        LLMutex                             mRecorderMutex; + +        int                                 mShouldLogCallCounter; + +    private: +        SettingsConfig(); +    }; + +    typedef LLPointer<SettingsConfig> SettingsConfigPtr; + +    SettingsConfig::SettingsConfig() +        : LLRefCount(), +        mDefaultLevel(LLError::LEVEL_DEBUG), +        mLogAlwaysFlush(true), +        mEnabledLogTypesMask(255), +        mFunctionLevelMap(), +        mClassLevelMap(), +        mFileLevelMap(), +        mTagLevelMap(), +        mUniqueLogMessages(), +        mCrashFunction(NULL), +        mTimeFunction(NULL), +        mRecorders(), +        mRecorderMutex(), +        mShouldLogCallCounter(0) +    { +    } + +    SettingsConfig::~SettingsConfig() +    { +        mRecorders.clear(); +    } +  	class Globals  	{      public: @@ -449,16 +505,31 @@ namespace      protected:  		Globals();  	public: +		std::ostringstream messageStream; +		bool messageStreamInUse;  		std::string mFatalMessage;  		void addCallSite(LLError::CallSite&);  		void invalidateCallSites(); +        SettingsConfigPtr getSettingsConfig(); + +        void resetSettingsConfig(); +        LLError::SettingsStoragePtr saveAndResetSettingsConfig(); +        void restore(LLError::SettingsStoragePtr pSettingsStorage);  	private:  		CallSiteVector callSites; +        SettingsConfigPtr mSettingsConfig;  	}; -	Globals::Globals() {} +	Globals::Globals() +		: messageStream(), +		messageStreamInUse(false), +		callSites(), +        mSettingsConfig(new SettingsConfig()) +	{ +	} +      Globals* Globals::getInstance()      { @@ -486,120 +557,31 @@ namespace  		callSites.clear();  	} -} -namespace LLError -{ -	class SettingsConfig : public LLRefCount -	{ -		friend class Settings; - -	public: -		virtual ~SettingsConfig(); - -		LLError::ELevel                     mDefaultLevel; - -        bool 								mLogAlwaysFlush; - -        U32 								mEnabledLogTypesMask; - -		LevelMap                            mFunctionLevelMap; -		LevelMap                            mClassLevelMap; -		LevelMap                            mFileLevelMap; -		LevelMap                            mTagLevelMap; -		std::map<std::string, unsigned int> mUniqueLogMessages; -		 -		LLError::FatalFunction              mCrashFunction; -		LLError::TimeFunction               mTimeFunction; - -		Recorders                           mRecorders; - -		int                                 mShouldLogCallCounter; - -	private: -		SettingsConfig(); -	}; - -	typedef LLPointer<SettingsConfig> SettingsConfigPtr; - -	class Settings -	{ -    public: -        static Settings* getInstance(); -    protected: -		Settings(); -	public: -		SettingsConfigPtr getSettingsConfig(); - -		void reset(); -		SettingsStoragePtr saveAndReset();  -		void restore(SettingsStoragePtr pSettingsStorage); -		 -	private: -		SettingsConfigPtr mSettingsConfig; -	}; - -	SettingsConfig::SettingsConfig() -		: LLRefCount(), -		mDefaultLevel(LLError::LEVEL_DEBUG), -		mLogAlwaysFlush(true), -		mEnabledLogTypesMask(255), -		mFunctionLevelMap(), -		mClassLevelMap(), -		mFileLevelMap(), -		mTagLevelMap(), -		mUniqueLogMessages(), -		mCrashFunction([](const std::string&){}), -		mTimeFunction(NULL), -		mRecorders(), -		mShouldLogCallCounter(0) -	{ -	} - -	SettingsConfig::~SettingsConfig() -	{ -		mRecorders.clear(); -	} - -	Settings::Settings(): -		mSettingsConfig(new SettingsConfig()) -	{ -	} - -    Settings* Settings::getInstance() +    SettingsConfigPtr Globals::getSettingsConfig()      { -        // According to C++11 Function-Local Initialization -        // of static variables is supposed to be thread safe -        // without risk of deadlocks. -        static Settings inst; - -        return &inst; +        return mSettingsConfig;      } -	SettingsConfigPtr Settings::getSettingsConfig() -	{ -		return mSettingsConfig; -	} - -	void Settings::reset() -	{ -		Globals::getInstance()->invalidateCallSites(); -		mSettingsConfig = new SettingsConfig(); -	} +    void Globals::resetSettingsConfig() +    { +        invalidateCallSites(); +        mSettingsConfig = new SettingsConfig(); +    } -	SettingsStoragePtr Settings::saveAndReset() -	{ -		SettingsStoragePtr oldSettingsConfig(mSettingsConfig.get()); -		reset(); -		return oldSettingsConfig; -	} +    LLError::SettingsStoragePtr Globals::saveAndResetSettingsConfig() +    { +        LLError::SettingsStoragePtr oldSettingsConfig(mSettingsConfig.get()); +        resetSettingsConfig(); +        return oldSettingsConfig; +    } -	void Settings::restore(SettingsStoragePtr pSettingsStorage) -	{ -		Globals::getInstance()->invalidateCallSites(); -		SettingsConfigPtr newSettingsConfig(dynamic_cast<SettingsConfig *>(pSettingsStorage.get())); -		mSettingsConfig = newSettingsConfig; -	} +    void Globals::restore(LLError::SettingsStoragePtr pSettingsStorage) +    { +        invalidateCallSites(); +        SettingsConfigPtr newSettingsConfig(dynamic_cast<SettingsConfig *>(pSettingsStorage.get())); +        mSettingsConfig = newSettingsConfig; +    }  }  namespace LLError @@ -723,7 +705,7 @@ namespace  	void commonInit(const std::string& user_dir, const std::string& app_dir, bool log_to_stderr = true)  	{ -		LLError::Settings::getInstance()->reset(); +		Globals::getInstance()->resetSettingsConfig();  		LLError::setDefaultLevel(LLError::LEVEL_INFO);  		LLError::setAlwaysFlush(true); @@ -764,13 +746,13 @@ namespace LLError  	void setFatalFunction(const FatalFunction& f)  	{ -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();  		s->mCrashFunction = f;  	}  	FatalFunction getFatalFunction()  	{ -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();  		return s->mCrashFunction;  	} @@ -781,72 +763,77 @@ namespace LLError  	void setTimeFunction(TimeFunction f)  	{ -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();  		s->mTimeFunction = f;  	}  	void setDefaultLevel(ELevel level)  	{ -		Globals::getInstance()->invalidateCallSites(); -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		Globals *g = Globals::getInstance(); +		g->invalidateCallSites(); +		SettingsConfigPtr s = g->getSettingsConfig();  		s->mDefaultLevel = level;  	}  	ELevel getDefaultLevel()  	{ -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();  		return s->mDefaultLevel;  	}  	void setAlwaysFlush(bool flush)  	{ -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();  		s->mLogAlwaysFlush = flush;  	}  	bool getAlwaysFlush()  	{ -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();  		return s->mLogAlwaysFlush;  	}  	void setEnabledLogTypesMask(U32 mask)  	{ -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();  		s->mEnabledLogTypesMask = mask;  	}  	U32 getEnabledLogTypesMask()  	{ -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();  		return s->mEnabledLogTypesMask;  	}  	void setFunctionLevel(const std::string& function_name, ELevel level)  	{ -		Globals::getInstance()->invalidateCallSites(); -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		Globals *g = Globals::getInstance(); +		g->invalidateCallSites(); +		SettingsConfigPtr s = g->getSettingsConfig();  		s->mFunctionLevelMap[function_name] = level;  	}  	void setClassLevel(const std::string& class_name, ELevel level)  	{ -		Globals::getInstance()->invalidateCallSites(); -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		Globals *g = Globals::getInstance(); +		g->invalidateCallSites(); +		SettingsConfigPtr s = g->getSettingsConfig();  		s->mClassLevelMap[class_name] = level;  	}  	void setFileLevel(const std::string& file_name, ELevel level)  	{ -		Globals::getInstance()->invalidateCallSites(); -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		Globals *g = Globals::getInstance(); +		g->invalidateCallSites(); +		SettingsConfigPtr s = g->getSettingsConfig();  		s->mFileLevelMap[file_name] = level;  	}  	void setTagLevel(const std::string& tag_name, ELevel level)  	{ -		Globals::getInstance()->invalidateCallSites(); -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		Globals *g = Globals::getInstance(); +		g->invalidateCallSites(); +		SettingsConfigPtr s = g->getSettingsConfig();  		s->mTagLevelMap[tag_name] = level;  	} @@ -891,8 +878,9 @@ namespace LLError  {  	void configure(const LLSD& config)  	{ -		Globals::getInstance()->invalidateCallSites(); -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		Globals *g = Globals::getInstance(); +		g->invalidateCallSites(); +		SettingsConfigPtr s = g->getSettingsConfig();  		s->mFunctionLevelMap.clear();  		s->mClassLevelMap.clear(); @@ -1019,7 +1007,8 @@ namespace LLError  		{  			return;  		} -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig(); +		LLMutexLock lock(&s->mRecorderMutex);  		s->mRecorders.push_back(recorder);  	} @@ -1029,7 +1018,8 @@ namespace LLError  		{  			return;  		} -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig(); +		LLMutexLock lock(&s->mRecorderMutex);  		s->mRecorders.erase(std::remove(s->mRecorders.begin(), s->mRecorders.end(), recorder),  							s->mRecorders.end());  	} @@ -1041,11 +1031,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 = Settings::getInstance()->getSettingsConfig();          // Since we promise to return an iterator, use a classic iterator          // loop.          auto end{s->mRecorders.end()}; @@ -1076,7 +1067,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 @@ -1085,10 +1078,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 = Settings::getInstance()->getSettingsConfig();              s->mRecorders.erase(found.second);          }          return bool(found.first); @@ -1187,10 +1181,11 @@ namespace  	{          LL_PROFILE_ZONE_SCOPED  		LLError::ELevel level = site.mLevel; -		LLError::SettingsConfigPtr s = LLError::Settings::getInstance()->getSettingsConfig(); +		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) @@ -1326,7 +1321,8 @@ namespace LLError  			return false;  		} -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		Globals *g = Globals::getInstance(); +		SettingsConfigPtr s = g->getSettingsConfig();  		s->mShouldLogCallCounter++; @@ -1356,7 +1352,7 @@ namespace LLError  			: false);  		site.mCached = true; -		Globals::getInstance()->addCallSite(site); +		g->addCallSite(site);  		return site.mShouldLog = site.mLevel >= compareLevel;  	} @@ -1371,7 +1367,7 @@ namespace LLError  		}  		Globals* g = Globals::getInstance(); -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		SettingsConfigPtr s = g->getSettingsConfig();  		std::string message = out.str(); @@ -1416,12 +1412,12 @@ namespace LLError  {  	SettingsStoragePtr saveAndResetSettings()  	{ -		return Settings::getInstance()->saveAndReset(); +		return Globals::getInstance()->saveAndResetSettingsConfig();  	}  	void restoreSettings(SettingsStoragePtr pSettingsStorage)  	{ -		return Settings::getInstance()->restore(pSettingsStorage); +		return Globals::getInstance()->restore(pSettingsStorage);  	}  	std::string removePrefix(std::string& s, const std::string& p) @@ -1467,7 +1463,7 @@ namespace LLError  	int shouldLogCallCount()  	{ -		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig(); +		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();  		return s->mShouldLogCallCounter;  	} @@ -1579,8 +1575,8 @@ bool debugLoggingEnabled(const std::string& tag)      {          return false;      } -         -    LLError::SettingsConfigPtr s = LLError::Settings::getInstance()->getSettingsConfig(); + +    SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();      LLError::ELevel level = LLError::LEVEL_DEBUG;      bool res = checkLevelMap(s->mTagLevelMap, tag, level);      return res; diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp index 64fb985951..0a213bddef 100644 --- a/indra/llcommon/llevents.cpp +++ b/indra/llcommon/llevents.cpp @@ -45,7 +45,6 @@  #include <cctype>  // external library headers  #include <boost/range/iterator_range.hpp> -#include <boost/make_shared.hpp>  #if LL_WINDOWS  #pragma warning (push)  #pragma warning (disable : 4701) // compiler thinks might use uninitialized var, but no @@ -285,7 +284,7 @@ LLEventPump::LLEventPump(const std::string& name, bool tweak):      // Register every new instance with LLEventPumps      mRegistry(LLEventPumps::instance().getHandle()),      mName(mRegistry.get()->registerNew(*this, name, tweak)), -    mSignal(boost::make_shared<LLStandardSignal>()), +    mSignal(std::make_shared<LLStandardSignal>()),      mEnabled(true)  {} @@ -317,14 +316,24 @@ void LLEventPump::clear()  {      // Destroy the original LLStandardSignal instance, replacing it with a      // whole new one. -    mSignal = boost::make_shared<LLStandardSignal>(); +    mSignal = std::make_shared<LLStandardSignal>();      mConnections.clear();  }  void LLEventPump::reset()  { -    mSignal.reset(); +    // Resetting mSignal is supposed to disconnect everything on its own +    // But due to crash on 'reset' added explicit cleanup to get more data +    ConnectionMap::const_iterator iter = mConnections.begin(); +    ConnectionMap::const_iterator end = mConnections.end(); +    while (iter!=end) +    { +        iter->second.disconnect(); +        iter++; +    }      mConnections.clear(); + +    mSignal.reset();      //mDeps.clear();  } @@ -543,7 +552,7 @@ bool LLEventStream::post(const LLSD& event)      // *stack* instance of the shared_ptr, ensuring that our heap      // LLStandardSignal object will live at least until post() returns, even      // if 'this' gets destroyed during the call. -    boost::shared_ptr<LLStandardSignal> signal(mSignal); +    std::shared_ptr<LLStandardSignal> signal(mSignal);      // Let caller know if any one listener handled the event. This is mostly      // useful when using LLEventStream as a listener for an upstream      // LLEventPump. diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h index e380c108f4..ae6e5aabc9 100644 --- a/indra/llcommon/llevents.h +++ b/indra/llcommon/llevents.h @@ -49,8 +49,6 @@  #endif  #include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp>  #include <boost/utility.hpp>        // noncopyable  #include <boost/optional/optional.hpp>  #include <boost/visit_each.hpp> @@ -571,7 +569,7 @@ protected:                                          const NameList& before);      /// implement the dispatching -    boost::shared_ptr<LLStandardSignal> mSignal; +    std::shared_ptr<LLStandardSignal> mSignal;      /// valve open?      bool mEnabled; @@ -745,14 +743,4 @@ private:  LL_COMMON_API bool sendReply(const LLSD& reply, const LLSD& request,                               const std::string& replyKey="reply"); -// Somewhat to my surprise, passing boost::bind(...boost::weak_ptr<T>...) to -// listen() fails in Boost code trying to instantiate LLEventListener (i.e. -// LLStandardSignal::slot_type) because the boost::get_pointer() utility function isn't -// specialized for boost::weak_ptr. This remedies that omission. -namespace boost -{ -    template <typename T> -    T* get_pointer(const weak_ptr<T>& ptr) { return shared_ptr<T>(ptr).get(); } -} -  #endif /* ! defined(LL_LLEVENTS_H) */ diff --git a/indra/llcommon/llregex.h b/indra/llcommon/llregex.h new file mode 100644 index 0000000000..2b7f5e47c2 --- /dev/null +++ b/indra/llcommon/llregex.h @@ -0,0 +1,89 @@ +/**  + * @file llregex.h + * + * $LicenseInfo:firstyear=2021&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2021, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LLREGEX_H +#define LLREGEX_H +#include <boost/regex.hpp> + +template <typename S, typename M, typename R> +LL_COMMON_API bool ll_regex_match(const S& string, M& match, const R& regex) +{ +	try +	{ +		return boost::regex_match(string, match, regex); +	} +	catch (const std::runtime_error& e) +	{ +		LL_WARNS() << "error matching with '" << regex.str() << "': " +			<< e.what() << ":\n'" << string << "'" << LL_ENDL; +		return false; +	} +} + +template <typename S, typename R> +LL_COMMON_API bool ll_regex_match(const S& string, const R& regex) +{ +	try +	{ +		return boost::regex_match(string, regex); +	} +	catch (const std::runtime_error& e) +	{ +		LL_WARNS() << "error matching with '" << regex.str() << "': " +			<< e.what() << ":\n'" << string << "'" << LL_ENDL; +		return false; +	} +} + +template <typename S, typename M, typename R> +bool ll_regex_search(const S& string, M& match, const R& regex) +{ +	try +	{ +		return boost::regex_search(string, match, regex); +	} +	catch (const std::runtime_error& e) +	{ +		LL_WARNS() << "error searching with '" << regex.str() << "': " +			<< e.what() << ":\n'" << string << "'" << LL_ENDL; +		return false; +	} +} + +template <typename S, typename R> +bool ll_regex_search(const S& string, const R& regex) +{ +	try +	{ +		return boost::regex_search(string, regex); +	} +	catch (const std::runtime_error& e) +	{ +		LL_WARNS() << "error searching with '" << regex.str() << "': " +			<< e.what() << ":\n'" << string << "'" << LL_ENDL; +		return false; +	} +} +#endif  // LLREGEX_H diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 306ef05b6d..18f4684b49 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -43,12 +43,12 @@  #include "llerrorcontrol.h"  #include "llevents.h"  #include "llformat.h" +#include "llregex.h"  #include "lltimer.h"  #include "llsdserialize.h"  #include "llsdutil.h"  #include <boost/bind.hpp>  #include <boost/circular_buffer.hpp> -#include <boost/regex.hpp>  #include <boost/foreach.hpp>  #include <boost/lexical_cast.hpp>  #include <boost/range.hpp> @@ -101,39 +101,6 @@ static const F32 MEM_INFO_THROTTLE = 20;  // dropped below the login framerate, we'd have very little additional data.  static const F32 MEM_INFO_WINDOW = 10*60; -// Wrap boost::regex_match() with a function that doesn't throw. -template <typename S, typename M, typename R> -static bool regex_match_no_exc(const S& string, M& match, const R& regex) -{ -    try -    { -        return boost::regex_match(string, match, regex); -    } -    catch (const std::runtime_error& e) -    { -        LL_WARNS("LLMemoryInfo") << "error matching with '" << regex.str() << "': " -                                 << e.what() << ":\n'" << string << "'" << LL_ENDL; -        return false; -    } -} - -// Wrap boost::regex_search() with a function that doesn't throw. -template <typename S, typename M, typename R> -static bool regex_search_no_exc(const S& string, M& match, const R& regex) -{ -    try -    { -        return boost::regex_search(string, match, regex); -    } -    catch (const std::runtime_error& e) -    { -        LL_WARNS("LLMemoryInfo") << "error searching with '" << regex.str() << "': " -                                 << e.what() << ":\n'" << string << "'" << LL_ENDL; -        return false; -    } -} - -  LLOSInfo::LLOSInfo() :  	mMajorVer(0), mMinorVer(0), mBuild(0), mOSVersionString("")	   { @@ -377,7 +344,7 @@ LLOSInfo::LLOSInfo() :  	boost::smatch matched;  	std::string glibc_version(gnu_get_libc_version()); -	if ( regex_match_no_exc(glibc_version, matched, os_version_parse) ) +	if ( ll_regex_match(glibc_version, matched, os_version_parse) )  	{  		LL_INFOS("AppInit") << "Using glibc version '" << glibc_version << "' as OS version" << LL_ENDL; @@ -1044,7 +1011,7 @@ LLSD LLMemoryInfo::loadStatsMap()  		while (std::getline(meminfo, line))  		{  			LL_DEBUGS("LLMemoryInfo") << line << LL_ENDL; -			if (regex_match_no_exc(line, matched, stat_rx)) +			if (ll_regex_match(line, matched, stat_rx))  			{  				// e.g. "MemTotal:		4108424 kB"  				LLSD::String key(matched[1].first, matched[1].second); | 
