diff options
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/indra_constants.h | 1 | ||||
| -rw-r--r-- | indra/llcommon/llcoros.cpp | 31 | ||||
| -rw-r--r-- | indra/llcommon/llcoros.h | 4 | ||||
| -rw-r--r-- | indra/llcommon/llerror.cpp | 24 | 
4 files changed, 41 insertions, 19 deletions
| diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index dc518b8ab4..56b373469a 100644 --- a/indra/llcommon/indra_constants.h +++ b/indra/llcommon/indra_constants.h @@ -335,6 +335,7 @@ const U8 CLICK_ACTION_OPEN = 4;  const U8 CLICK_ACTION_PLAY = 5;  const U8 CLICK_ACTION_OPEN_MEDIA = 6;  const U8 CLICK_ACTION_ZOOM = 7; +const U8 CLICK_ACTION_DISABLED = 8;  // DO NOT CHANGE THE SEQUENCE OF THIS LIST!! diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp index c5ba23f68c..67e9fad1ab 100644 --- a/indra/llcommon/llcoros.cpp +++ b/indra/llcommon/llcoros.cpp @@ -35,6 +35,7 @@  // external library headers  #include <boost/bind.hpp>  // other Linden headers +#include "lltimer.h"  #include "llevents.h"  #include "llerror.h"  #include "stringize.h" @@ -280,6 +281,25 @@ void LLCoros::setStackSize(S32 stacksize)      mStackSize = stacksize;  } +void LLCoros::printActiveCoroutines() +{ +    LL_INFOS("LLCoros") << "Number of active coroutines: " << (S32)mCoros.size() << LL_ENDL; +    if (mCoros.size() > 0) +    { +        LL_INFOS("LLCoros") << "-------------- List of active coroutines ------------"; +        CoroMap::iterator iter; +        CoroMap::iterator end = mCoros.end(); +        F64 time = LLTimer::getTotalSeconds(); +        for (iter = mCoros.begin(); iter != end; iter++) +        { +            F64 life_time = time - iter->second->mCreationTime; +            LL_CONT << LL_NEWLINE << "Name: " << iter->first << " life: " << life_time; +        } +        LL_CONT << LL_ENDL; +        LL_INFOS("LLCoros") << "-----------------------------------------------------" << LL_ENDL; +    } +} +  #if LL_WINDOWS  static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific @@ -375,7 +395,8 @@ LLCoros::CoroData::CoroData(CoroData* prev, const std::string& name,      mCoro(boost::bind(toplevel, _1, this, callable), stacksize),      // don't consume events unless specifically directed      mConsuming(false), -    mSelf(0) +    mSelf(0), +    mCreationTime(LLTimer::getTotalSeconds())  {  } @@ -384,7 +405,13 @@ std::string LLCoros::launch(const std::string& prefix, const callable_t& callabl      std::string name(generateDistinctName(prefix));      Current current;      // pass the current value of Current as previous context -    CoroData* newCoro = new CoroData(current, name, callable, mStackSize); +    CoroData* newCoro = new(std::nothrow) CoroData(current, name, callable, mStackSize); +    if (newCoro == NULL) +    { +        // Out of memory? +        printActiveCoroutines(); +        LL_ERRS("LLCoros") << "Failed to start coroutine: " << name << " Stacksize: " << mStackSize << " Total coroutines: " << mCoros.size() << LL_ENDL; +    }      // Store it in our pointer map      mCoros.insert(name, newCoro);      // also set it as current diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index 884d6b159c..8fb27af6a4 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -151,6 +151,9 @@ public:      /// for delayed initialization      void setStackSize(S32 stacksize); +    /// for delayed initialization +    void printActiveCoroutines(); +      /// get the current coro::self& for those who really really care      static coro::self& get_self(); @@ -223,6 +226,7 @@ private:          // function signature down to that point -- and of course through every          // other caller of every such function.          LLCoros::coro::self* mSelf; +        F64 mCreationTime; // since epoch      };      typedef boost::ptr_map<std::string, CoroData> CoroMap;      CoroMap mCoros; diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index f31a054139..29de79dc64 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -249,23 +249,13 @@ namespace LLError  	{  #ifdef __GNUC__  		// GCC: type_info::name() returns a mangled class name,st demangle - -		static size_t abi_name_len = 100; -		static char* abi_name_buf = (char*)malloc(abi_name_len); -			// warning: above is voodoo inferred from the GCC manual, -			// do NOT change - -		int status; -			// We don't use status, and shouldn't have to pass apointer to it -			// but gcc 3.3 libstc++'s implementation of demangling is broken -			// and fails without. -			 -		char* name = abi::__cxa_demangle(mangled, -										abi_name_buf, &abi_name_len, &status); -			// this call can realloc the abi_name_buf pointer (!) - -		return name ? name : mangled; - +        // passing nullptr, 0 forces allocation of a unique buffer we can free +        // fixing MAINT-8724 on OSX 10.14 +		int status = -1; +		char* name = abi::__cxa_demangle(mangled, nullptr, 0, &status); +        std::string result(name ? name : mangled); +        free(name); +        return result;  #elif LL_WINDOWS  		// DevStudio: type_info::name() includes the text "class " at the start | 
