diff options
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/llassettype.cpp | 11 | ||||
| -rw-r--r-- | indra/llcommon/llassettype.h | 9 | ||||
| -rw-r--r-- | indra/llcommon/lldarray.h | 2 | ||||
| -rw-r--r-- | indra/llcommon/llfoldertype.cpp | 3 | ||||
| -rw-r--r-- | indra/llcommon/llfoldertype.h | 6 | ||||
| -rw-r--r-- | indra/llcommon/llthread.cpp | 46 | ||||
| -rw-r--r-- | indra/llcommon/llthread.h | 22 | ||||
| -rw-r--r-- | indra/llcommon/stdenums.h | 3 | 
8 files changed, 89 insertions, 13 deletions
| diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp index e5068f1bc5..9707a05f16 100644 --- a/indra/llcommon/llassettype.cpp +++ b/indra/llcommon/llassettype.cpp @@ -45,7 +45,7 @@ struct AssetEntry : public LLDictionaryEntry  	AssetEntry(const char *desc_name,  			   const char *type_name, 	// 8 character limit!  			   const char *human_name, 	// for decoding to human readable form; put any and as many printable characters you want in each one -			   BOOL can_link, 			// can you create a link to this type? +			   bool can_link, 			// can you create a link to this type?  			   BOOL can_fetch, 			// can you fetch this asset by ID?  			   BOOL can_know) 			// can you see this asset's ID?  		: @@ -61,7 +61,7 @@ struct AssetEntry : public LLDictionaryEntry  	const char *mTypeName;  	const char *mHumanName; -	BOOL mCanLink; +	bool mCanLink;  	BOOL mCanFetch;  	BOOL mCanKnow;  }; @@ -100,7 +100,10 @@ LLAssetDictionary::LLAssetDictionary()  	addEntry(LLAssetType::AT_LINK, 				new AssetEntry("LINK",				"link",		"sym link",			FALSE,		FALSE,		TRUE));  	addEntry(LLAssetType::AT_LINK_FOLDER, 		new AssetEntry("FOLDER_LINK",		"link_f", 	"sym folder link",	FALSE,		FALSE,		TRUE)); +	addEntry(LLAssetType::AT_MESH,              new AssetEntry("MESH",              "mesh",     "mesh",             FALSE, FALSE, FALSE)); +	  	addEntry(LLAssetType::AT_NONE, 				new AssetEntry("NONE",				"-1",		NULL,		  		FALSE,		FALSE,		FALSE)); +  };  // static @@ -202,7 +205,7 @@ LLAssetType::EType LLAssetType::lookupHumanReadable(const std::string& readable_  }  // static -BOOL LLAssetType::lookupCanLink(EType asset_type) +bool LLAssetType::lookupCanLink(EType asset_type)  {  	const LLAssetDictionary *dict = LLAssetDictionary::getInstance();  	const AssetEntry *entry = dict->lookup(asset_type); @@ -210,7 +213,7 @@ BOOL LLAssetType::lookupCanLink(EType asset_type)  	{  		return entry->mCanLink;  	} -	return FALSE; +	return false;  }  // static diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h index 4440e1bac3..22bcf5c498 100644 --- a/indra/llcommon/llassettype.h +++ b/indra/llcommon/llassettype.h @@ -114,8 +114,11 @@ public:  		AT_LINK_FOLDER = 25,  			// Inventory folder link -		 -		AT_COUNT = 26, + +		AT_MESH = 49, +		    // Mesh data in our proprietary SLM format + +		AT_COUNT = 50,  			// +*********************************************************+  			// |  TO ADD AN ELEMENT TO THIS ENUM:                        | @@ -143,7 +146,7 @@ public:  	static EType 				getType(const std::string& desc_name);  	static const std::string&	getDesc(EType asset_type); -	static BOOL 				lookupCanLink(EType asset_type); +	static bool 				lookupCanLink(EType asset_type);  	static BOOL 				lookupIsLinkType(EType asset_type);  	static BOOL 				lookupIsAssetFetchByIDAllowed(EType asset_type); // the asset allows direct download diff --git a/indra/llcommon/lldarray.h b/indra/llcommon/lldarray.h index 0e56a11d53..af647c7e7a 100644 --- a/indra/llcommon/lldarray.h +++ b/indra/llcommon/lldarray.h @@ -202,7 +202,7 @@ public:  		{  			U32 n = mVector.size();  			mIndexMap[k] = n; -			mVector.resize(n+1); +			mVector.push_back(Type());  			llassert(mVector.size() == mIndexMap.size());  			return mVector[n];  		} diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp index 2610fe9e6a..16ae4cddde 100644 --- a/indra/llcommon/llfoldertype.cpp +++ b/indra/llcommon/llfoldertype.cpp @@ -95,6 +95,9 @@ LLFolderDictionary::LLFolderDictionary()  	addEntry(LLFolderType::FT_CURRENT_OUTFIT, 		new FolderEntry("current",	TRUE));  	addEntry(LLFolderType::FT_OUTFIT, 				new FolderEntry("outfit",	FALSE));  	addEntry(LLFolderType::FT_MY_OUTFITS, 			new FolderEntry("my_otfts",	TRUE)); + +	addEntry(LLFolderType::FT_MESH, 				new FolderEntry("mesh",	TRUE)); +  	addEntry(LLFolderType::FT_INBOX, 				new FolderEntry("inbox",	TRUE));  	addEntry(LLFolderType::FT_NONE, 				new FolderEntry("-1",		FALSE)); diff --git a/indra/llcommon/llfoldertype.h b/indra/llcommon/llfoldertype.h index 7aa77f7f7e..409112a04e 100644 --- a/indra/llcommon/llfoldertype.h +++ b/indra/llcommon/llfoldertype.h @@ -86,9 +86,11 @@ public:  		FT_OUTFIT = 47,  		FT_MY_OUTFITS = 48, -		FT_INBOX = 49, +		FT_MESH = 49, -		FT_COUNT = 50, +		FT_INBOX = 50, + +		FT_COUNT = 51,  		FT_NONE = -1  	}; diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp index 37370e44e7..0385569a02 100644 --- a/indra/llcommon/llthread.cpp +++ b/indra/llcommon/llthread.cpp @@ -62,6 +62,12 @@  //   //---------------------------------------------------------------------------- +#if !LL_DARWIN +U32 ll_thread_local sThreadID = 0; +#endif  + +U32 LLThread::sIDIter = 0; +  //  // Handed to the APR thread creation function  // @@ -72,10 +78,14 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap  	// Set thread state to running  	threadp->mStatus = RUNNING; +#if !LL_DARWIN +	sThreadID = threadp->mID; +#endif +  	// Run the user supplied function  	threadp->run(); -	llinfos << "LLThread::staticRun() Exiting: " << threadp->mName << llendl; +	//llinfos << "LLThread::staticRun() Exiting: " << threadp->mName << llendl;  	// We're done with the run function, this thread is done executing now.  	threadp->mStatus = STOPPED; @@ -90,6 +100,8 @@ LLThread::LLThread(const std::string& name, apr_pool_t *poolp) :  	mAPRThreadp(NULL),  	mStatus(STOPPED)  { +	mID = ++sIDIter; +  	// Thread creation probably CAN be paranoid about APR being initialized, if necessary  	if (poolp)  	{ @@ -273,7 +285,7 @@ void LLThread::wakeLocked()  //============================================================================  LLMutex::LLMutex(apr_pool_t *poolp) : -	mAPRMutexp(NULL) +	mAPRMutexp(NULL), mCount(0), mLockingThread(NO_THREAD)  {  	//if (poolp)  	//{ @@ -305,7 +317,18 @@ LLMutex::~LLMutex()  void LLMutex::lock()  { +#if LL_DARWIN +	if (mLockingThread == LLThread::currentID()) +#else +	if (mLockingThread == sThreadID) +#endif +	{ //redundant lock +		mCount++; +		return; +	} +	  	apr_thread_mutex_lock(mAPRMutexp); +	  #if MUTEX_DEBUG  	// Have to have the lock before we can access the debug info  	U32 id = LLThread::currentID(); @@ -313,10 +336,22 @@ void LLMutex::lock()  		llerrs << "Already locked in Thread: " << id << llendl;  	mIsLocked[id] = TRUE;  #endif + +#if LL_DARWIN +	mLockingThread = LLThread::currentID(); +#else +	mLockingThread = sThreadID; +#endif  }  void LLMutex::unlock()  { +	if (mCount > 0) +	{ //not the root unlock +		mCount--; +		return; +	} +	  #if MUTEX_DEBUG  	// Access the debug info while we have the lock  	U32 id = LLThread::currentID(); @@ -324,6 +359,8 @@ void LLMutex::unlock()  		llerrs << "Not locked in Thread: " << id << llendl;	  	mIsLocked[id] = FALSE;  #endif + +	mLockingThread = NO_THREAD;  	apr_thread_mutex_unlock(mAPRMutexp);  } @@ -341,6 +378,11 @@ bool LLMutex::isLocked()  	}  } +U32 LLMutex::lockingThread() const +{ +	return mLockingThread; +} +  //============================================================================  LLCondition::LLCondition(apr_pool_t *poolp) : diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h index adef1a9192..4b6c3df105 100644 --- a/indra/llcommon/llthread.h +++ b/indra/llcommon/llthread.h @@ -41,8 +41,17 @@ class LLThread;  class LLMutex;  class LLCondition; +#if LL_WINDOWS +#define ll_thread_local __declspec(thread) +#else +#define ll_thread_local __thread +#endif +  class LL_COMMON_API LLThread  { +private: +	static U32 sIDIter; +  public:  	typedef enum e_thread_status  	{ @@ -83,6 +92,8 @@ public:  	apr_pool_t *getAPRPool() { return mAPRPoolp; }  	LLVolatileAPRPool* getLocalAPRFilePool() { return mLocalAPRFilePoolp ; } +	U32 getID() const { return mID; } +  private:  	BOOL				mPaused; @@ -97,6 +108,7 @@ protected:  	apr_pool_t			*mAPRPoolp;  	BOOL				mIsLocalPool;  	EThreadStatus		mStatus; +	U32					mID;  	//a local apr_pool for APRFile operations in this thread. If it exists, LLAPRFile::sAPRFilePoolp should not be used.  	//Note: this pool is used by APRFile ONLY, do NOT use it for any other purposes. @@ -134,17 +146,27 @@ protected:  class LL_COMMON_API LLMutex  {  public: +	typedef enum +	{ +		NO_THREAD = 0xFFFFFFFF +	} e_locking_thread; +  	LLMutex(apr_pool_t *apr_poolp); // NULL pool constructs a new pool for the mutex  	~LLMutex();  	void lock();		// blocks  	void unlock();  	bool isLocked(); 	// non-blocking, but does do a lock/unlock so not free +	U32 lockingThread() const; //get ID of locking thread  protected:  	apr_thread_mutex_t *mAPRMutexp; +	mutable U32			mCount; +	mutable U32			mLockingThread; +	  	apr_pool_t			*mAPRPoolp;  	BOOL				mIsLocalPool; +	  #if MUTEX_DEBUG  	std::map<U32, BOOL> mIsLocked;  #endif diff --git a/indra/llcommon/stdenums.h b/indra/llcommon/stdenums.h index 1a5678dde1..6eead924da 100644 --- a/indra/llcommon/stdenums.h +++ b/indra/llcommon/stdenums.h @@ -55,7 +55,8 @@ enum EDragAndDropType  	DAD_ANIMATION		= 12,  	DAD_GESTURE			= 13,  	DAD_LINK			= 14, -	DAD_COUNT			= 15,   // number of types in this enum +	DAD_MESH           		= 15, +	DAD_COUNT			= 16,   // number of types in this enum  };  // Reasons for drags to be denied. | 
