diff options
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/indra_constants.cpp | 1 | ||||
| -rw-r--r-- | indra/llcommon/indra_constants.h | 2 | ||||
| -rw-r--r-- | indra/llcommon/llcommon.cpp | 4 | ||||
| -rw-r--r-- | indra/llcommon/llcoros.cpp | 17 | ||||
| -rw-r--r-- | indra/llcommon/llcoros.h | 10 | ||||
| -rw-r--r-- | indra/llcommon/llerror.cpp | 12 | ||||
| -rw-r--r-- | indra/llcommon/llevents.cpp | 10 | ||||
| -rw-r--r-- | indra/llcommon/llevents.h | 3 | ||||
| -rw-r--r-- | indra/llcommon/llfixedbuffer.h | 3 | ||||
| -rw-r--r-- | indra/llcommon/llmutex.cpp | 16 | ||||
| -rw-r--r-- | indra/llcommon/llrefcount.h | 7 | ||||
| -rw-r--r-- | indra/llcommon/llstrider.h | 2 | ||||
| -rw-r--r-- | indra/llcommon/llthread.cpp | 24 | 
13 files changed, 61 insertions, 50 deletions
diff --git a/indra/llcommon/indra_constants.cpp b/indra/llcommon/indra_constants.cpp index 9a0c565b06..39e232e480 100644 --- a/indra/llcommon/indra_constants.cpp +++ b/indra/llcommon/indra_constants.cpp @@ -89,3 +89,4 @@ const LLUUID IMG_USE_BAKED_AUX1  ("9742065b-19b5-297c-858a-29711d539043");  const LLUUID IMG_USE_BAKED_AUX2  ("03642e83-2bd1-4eb9-34b4-4c47ed586d2d");  const LLUUID IMG_USE_BAKED_AUX3  ("edd51b77-fc10-ce7a-4b3d-011dfc349e4f"); +const LLUUID BLANK_MATERIAL_ASSET_ID ("968cbad0-4dad-d64e-71b5-72bf13ad051a"); diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index a16cfac2b9..a4b2efef98 100644 --- a/indra/llcommon/indra_constants.h +++ b/indra/llcommon/indra_constants.h @@ -236,6 +236,8 @@ LL_COMMON_API extern const LLUUID DEFAULT_OBJECT_SPECULAR;  LL_COMMON_API extern const LLUUID DEFAULT_OBJECT_NORMAL;  LL_COMMON_API extern const LLUUID BLANK_OBJECT_NORMAL; +LL_COMMON_API extern const LLUUID BLANK_MATERIAL_ASSET_ID; +  // radius within which a chat message is fully audible  const F32 CHAT_NORMAL_RADIUS = 20.f; diff --git a/indra/llcommon/llcommon.cpp b/indra/llcommon/llcommon.cpp index 335c586c1d..99f074a2f6 100644 --- a/indra/llcommon/llcommon.cpp +++ b/indra/llcommon/llcommon.cpp @@ -128,8 +128,7 @@ void LLCommon::initClass()  		sAprInitialized = true;  	}  	LLTimer::initClass(); -	LLThreadSafeRefCount::initThreadSafeRefCount(); -	assert_main_thread();		// Make sure we record the main thread +	assert_main_thread();       // Make sure we record the main thread  	if (!sMasterThreadRecorder)  	{  		sMasterThreadRecorder = new LLTrace::ThreadRecorder(); @@ -143,7 +142,6 @@ void LLCommon::cleanupClass()  	delete sMasterThreadRecorder;  	sMasterThreadRecorder = NULL;  	LLTrace::set_master_thread_recorder(NULL); -	LLThreadSafeRefCount::cleanupThreadSafeRefCount();  	SUBSYSTEM_CLEANUP_DBG(LLTimer);  	if (sAprInitialized)  	{ diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp index c13900f74a..219c65fbb8 100644 --- a/indra/llcommon/llcoros.cpp +++ b/indra/llcommon/llcoros.cpp @@ -61,6 +61,23 @@  #include <excpt.h>  #endif +// static  +bool LLCoros::on_main_coro() +{ +    if (!LLCoros::instanceExists() || LLCoros::getName().empty()) +    { +        return true; +    } +     +    return false; +} + +// static +bool LLCoros::on_main_thread_main_coro() +{ +    return on_main_coro() && on_main_thread(); +} +  // static  LLCoros::CoroData& LLCoros::get_CoroData(const std::string& caller)  { diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index fd878f20ad..00650a2454 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -94,6 +94,16 @@ class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>      void cleanupSingleton() override;  public: +    // For debugging, return true if on the main coroutine for the current thread +    // Code that should not be executed from a coroutine should be protected by +    // llassert(LLCoros::on_main_coro()) +    static bool on_main_coro(); + +    // For debugging, return true if on the main thread and not in a coroutine +    // Non-thread-safe code in the main loop should be protected by  +    // llassert(LLCoros::on_main_thread_main_coro()) +    static bool on_main_thread_main_coro(); +      /// The viewer's use of the term "coroutine" became deeply embedded before      /// the industry term "fiber" emerged to distinguish userland threads from      /// simpler, more transient kinds of coroutines. Semantically they've diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index 6211362615..94c1cc0421 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -506,7 +506,7 @@ namespace          LLError::TimeFunction               mTimeFunction;          Recorders                           mRecorders; -        LLMutex                             mRecorderMutex; +        LLCoros::Mutex                      mRecorderMutex;          int                                 mShouldLogCallCounter; @@ -1044,7 +1044,7 @@ namespace LLError  			return;  		}  		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig(); -		LLMutexLock lock(&s->mRecorderMutex); +		LLCoros::LockType lock(s->mRecorderMutex);  		s->mRecorders.push_back(recorder);  	} @@ -1055,7 +1055,7 @@ namespace LLError  			return;  		}  		SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig(); -		LLMutexLock lock(&s->mRecorderMutex); +		LLCoros::LockType lock(s->mRecorderMutex);  		s->mRecorders.erase(std::remove(s->mRecorders.begin(), s->mRecorders.end(), recorder),  							s->mRecorders.end());  	} @@ -1104,7 +1104,7 @@ namespace LLError      std::shared_ptr<RECORDER> findRecorder()      {          SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig(); -        LLMutexLock lock(&s->mRecorderMutex); +        LLCoros::LockType lock(s->mRecorderMutex);          return findRecorderPos<RECORDER>(s).first;      } @@ -1115,7 +1115,7 @@ namespace LLError      bool removeRecorder()      {          SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig(); -        LLMutexLock lock(&s->mRecorderMutex); +        LLCoros::LockType lock(s->mRecorderMutex);          auto found = findRecorderPos<RECORDER>(s);          if (found.first)          { @@ -1221,7 +1221,7 @@ namespace          std::string escaped_message; -        LLMutexLock lock(&s->mRecorderMutex); +        LLCoros::LockType lock(s->mRecorderMutex);  		for (LLError::RecorderPtr& r : s->mRecorders)  		{              if (!r->enabled()) diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp index 70931f3a65..8006f9d059 100644 --- a/indra/llcommon/llevents.cpp +++ b/indra/llcommon/llevents.cpp @@ -382,7 +382,7 @@ std::string LLEventPump::inventName(const std::string& pfx)  void LLEventPump::clear()  { -    LLMutexLock lock(&mConnectionListMutex); +    LLCoros::LockType lock(mConnectionListMutex);      // Destroy the original LLStandardSignal instance, replacing it with a      // whole new one.      mSignal = std::make_shared<LLStandardSignal>(); @@ -394,7 +394,7 @@ void LLEventPump::reset()  {      // Resetting mSignal is supposed to disconnect everything on its own      // But due to crash on 'reset' added explicit cleanup to get more data -    LLMutexLock lock(&mConnectionListMutex); +    LLCoros::LockType lock(mConnectionListMutex);      ConnectionMap::const_iterator iter = mConnections.begin();      ConnectionMap::const_iterator end = mConnections.end();      while (iter!=end) @@ -419,7 +419,7 @@ LLBoundListener LLEventPump::listen_impl(const std::string& name, const LLEventL          return LLBoundListener();      } -    LLMutexLock lock(&mConnectionListMutex); +    LLCoros::LockType lock(mConnectionListMutex);      float nodePosition = 1.0; @@ -582,7 +582,7 @@ LLBoundListener LLEventPump::listen_impl(const std::string& name, const LLEventL  LLBoundListener LLEventPump::getListener(const std::string& name)  { -    LLMutexLock lock(&mConnectionListMutex); +    LLCoros::LockType lock(mConnectionListMutex);      ConnectionMap::const_iterator found = mConnections.find(name);      if (found != mConnections.end())      { @@ -594,7 +594,7 @@ LLBoundListener LLEventPump::getListener(const std::string& name)  void LLEventPump::stopListening(const std::string& name)  { -    LLMutexLock lock(&mConnectionListMutex); +    LLCoros::LockType lock(mConnectionListMutex);      ConnectionMap::iterator found = mConnections.find(name);      if (found != mConnections.end())      { diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h index bebcfacdcb..df54a6546d 100644 --- a/indra/llcommon/llevents.h +++ b/indra/llcommon/llevents.h @@ -61,6 +61,7 @@  #include "llstl.h"  #include "llexception.h"  #include "llhandle.h" +#include "llcoros.h"  /*==========================================================================*|  // override this to allow binding free functions with more parameters @@ -601,7 +602,7 @@ private:      LLHandle<LLEventPumps> mRegistry;      std::string mName; -    LLMutex mConnectionListMutex; +    LLCoros::Mutex mConnectionListMutex;  protected:      virtual LLBoundListener listen_impl(const std::string& name, const LLEventListener&, diff --git a/indra/llcommon/llfixedbuffer.h b/indra/llcommon/llfixedbuffer.h index 554cf48a4c..b3bef7520b 100644 --- a/indra/llcommon/llfixedbuffer.h +++ b/indra/llcommon/llfixedbuffer.h @@ -33,6 +33,7 @@  #include "llstring.h"  #include "llthread.h"  #include "llerrorcontrol.h" +#include "llcoros.h"  //  fixed buffer implementation  class LL_COMMON_API LLFixedBuffer : public LLLineBuffer @@ -58,7 +59,7 @@ protected:  	void addWLine(const LLWString& line);  protected: -	LLMutex mMutex ; +	LLCoros::Mutex mMutex ;  };  #endif //LL_FIXED_BUFFER_H diff --git a/indra/llcommon/llmutex.cpp b/indra/llcommon/llmutex.cpp index 3cfdc8304e..d5c168a50d 100644 --- a/indra/llcommon/llmutex.cpp +++ b/indra/llcommon/llmutex.cpp @@ -28,6 +28,7 @@  #include "llmutex.h"  #include "llthread.h"  #include "lltimer.h" +#include "llcoros.h"  //--------------------------------------------------------------------- @@ -45,7 +46,17 @@ LLMutex::~LLMutex()  void LLMutex::lock()  { -    LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD +    LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD; + +    // LLMutex is not coroutine aware and should not be used from a coroutine +    // If your code is running in a coroutine, you should use LLCoros::Mutex instead +    // NOTE:  If the stack trace you're staring at contains non-thread-safe code, +    // you should use LLAppViewer::instance().postToMainThread() to shuttle execution +    // back to the main loop. +    // NOTE: If you got here from seeing this assert in your log and you're not seeing +    // a stack trace that points here, put a breakpoint in on_main_coro and try again. +    llassert(LLCoros::on_main_coro()); +  	if(isSelfLocked())  	{ //redundant lock  		mCount++; @@ -67,7 +78,8 @@ void LLMutex::lock()  void LLMutex::unlock()  { -    LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD +    LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD; +  	if (mCount > 0)  	{ //not the root unlock  		mCount--; diff --git a/indra/llcommon/llrefcount.h b/indra/llcommon/llrefcount.h index 15e7175fc8..109c29c0c9 100644 --- a/indra/llcommon/llrefcount.h +++ b/indra/llcommon/llrefcount.h @@ -89,13 +89,6 @@ private:  class LL_COMMON_API LLThreadSafeRefCount  { -public: -	static void initThreadSafeRefCount(); // creates sMutex -	static void cleanupThreadSafeRefCount(); // destroys sMutex - -private: -	static LLMutex* sMutex; -  protected:  	virtual ~LLThreadSafeRefCount(); // use unref() diff --git a/indra/llcommon/llstrider.h b/indra/llcommon/llstrider.h index ed9284d2c5..e7522484e6 100644 --- a/indra/llcommon/llstrider.h +++ b/indra/llcommon/llstrider.h @@ -37,8 +37,8 @@ template <class Object> class LLStrider  	};  	U32     mSkip;  public: -  	LLStrider()  { mObjectp = NULL; mSkip = sizeof(Object); }  +    LLStrider(Object* first) { mObjectp = first; mSkip = sizeof(Object); }  	~LLStrider() { }   	const LLStrider<Object>& operator =  (Object *first)    { mObjectp = first; return *this;} diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp index 1db97ad3e3..86eb53cf62 100644 --- a/indra/llcommon/llthread.cpp +++ b/indra/llcommon/llthread.cpp @@ -421,30 +421,6 @@ void LLThread::unlockData()  //============================================================================ -//---------------------------------------------------------------------------- - -//static -LLMutex* LLThreadSafeRefCount::sMutex = 0; - -//static -void LLThreadSafeRefCount::initThreadSafeRefCount() -{ -    if (!sMutex) -    { -        sMutex = new LLMutex(); -    } -} - -//static -void LLThreadSafeRefCount::cleanupThreadSafeRefCount() -{ -    delete sMutex; -    sMutex = NULL; -} -     - -//---------------------------------------------------------------------------- -  LLThreadSafeRefCount::LLThreadSafeRefCount() :      mRef(0)  {  | 
