diff options
| author | Nat Goodspeed <nat@lindenlab.com> | 2012-04-26 14:04:55 -0400 | 
|---|---|---|
| committer | Nat Goodspeed <nat@lindenlab.com> | 2012-04-26 14:04:55 -0400 | 
| commit | 78f2663c4a61a7983c84cf50e5d2fdd92811a1b0 (patch) | |
| tree | 56bf81cc39cb8c5180508c37c552c8ab23273300 /indra/llmessage | |
| parent | d6569db3520f7e0ce2d93febb6f4e26b48c08a3d (diff) | |
| parent | 75c53a6a269890b9fe78b4b50d9b093a94778650 (diff) | |
Automated merge with http://hg.secondlife.com/viewer-release
Diffstat (limited to 'indra/llmessage')
| -rw-r--r-- | indra/llmessage/llcurl.cpp | 53 | ||||
| -rw-r--r-- | indra/llmessage/llcurl.h | 5 | 
2 files changed, 40 insertions, 18 deletions
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index b93d429feb..5161ee6291 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -548,6 +548,7 @@ LLCurl::Multi::Multi(F32 idle_time_out)  	  mErrorCount(0),  	  mState(STATE_READY),  	  mDead(FALSE), +	  mValid(TRUE),  	  mMutexp(NULL),  	  mDeletionMutexp(NULL),  	  mEasyMutexp(NULL) @@ -583,22 +584,33 @@ LLCurl::Multi::Multi(F32 idle_time_out)  LLCurl::Multi::~Multi()  { -	cleanup() ;	 +	cleanup(true) ;	 +	 +	delete mDeletionMutexp ; +	mDeletionMutexp = NULL ;	  } -void LLCurl::Multi::cleanup() +void LLCurl::Multi::cleanup(bool deleted)  {  	if(!mCurlMultiHandle)  	{  		return ; //nothing to clean.  	} +	llassert_always(deleted || !mValid) ; +	LLMutexLock lock(mDeletionMutexp); +	  	// Clean up active  	for(easy_active_list_t::iterator iter = mEasyActiveList.begin();  		iter != mEasyActiveList.end(); ++iter)  	{  		Easy* easy = *iter;  		check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle())); + +		if(deleted) +		{ +			easy->mResponder = NULL ; //avoid triggering mResponder. +		}  		delete easy;  	}  	mEasyActiveList.clear(); @@ -610,11 +622,9 @@ void LLCurl::Multi::cleanup()  	check_curl_multi_code(LLCurl::deleteMultiHandle(mCurlMultiHandle));  	mCurlMultiHandle = NULL ; - +	  	delete mMutexp ;  	mMutexp = NULL ; -	delete mDeletionMutexp ; -	mDeletionMutexp = NULL ;  	delete mEasyMutexp ;  	mEasyMutexp = NULL ; @@ -644,10 +654,20 @@ void LLCurl::Multi::unlock()  void LLCurl::Multi::markDead()  { -	LLMutexLock lock(mDeletionMutexp) ; +	{ +		LLMutexLock lock(mDeletionMutexp) ; -	mDead = TRUE ; -	LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_URGENT) ;  +		if(mCurlMultiHandle != NULL) +		{ +			mDead = TRUE ; +			LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_URGENT) ;  + +			return; +		} +	} +	 +	//not valid, delete it. +	delete this;	  }  void LLCurl::Multi::setState(LLCurl::Multi::ePerformState state) @@ -741,10 +761,14 @@ bool LLCurl::Multi::doPerform()  		setState(STATE_COMPLETED) ;  		mIdleTimer.reset() ;  	} -	else if(mIdleTimer.getElapsedTimeF32() > mIdleTimeOut) //idle for too long, remove it. +	else if(!mValid && mIdleTimer.getElapsedTimeF32() > mIdleTimeOut) //idle for too long, remove it.  	{  		dead = true ;  	} +	else if(mValid && mIdleTimer.getElapsedTimeF32() > mIdleTimeOut - 1.f) //idle for too long, mark it invalid. +	{ +		mValid = FALSE ; +	}  	return dead ;  } @@ -966,15 +990,8 @@ void LLCurlThread::killMulti(LLCurl::Multi* multi)  		return ;  	} -	if(multi->isValid()) -	{  	multi->markDead() ;  } -	else -	{ -		deleteMulti(multi) ; -	} -}  //private  bool LLCurlThread::doMultiPerform(LLCurl::Multi* multi)  @@ -992,6 +1009,10 @@ void LLCurlThread::deleteMulti(LLCurl::Multi* multi)  void LLCurlThread::cleanupMulti(LLCurl::Multi* multi)   {  	multi->cleanup() ; +	if(multi->isDead()) //check if marked dead during cleaning up. +	{ +		deleteMulti(multi) ; +	}  }  //------------------------------------------------------------ diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h index fd664c0fa1..d6a7714d4c 100644 --- a/indra/llmessage/llcurl.h +++ b/indra/llmessage/llcurl.h @@ -304,7 +304,7 @@ public:  	ePerformState getState() ;  	bool isCompleted() ; -	bool isValid() {return mCurlMultiHandle != NULL ;} +	bool isValid() {return mCurlMultiHandle != NULL && mValid;}  	bool isDead() {return mDead;}  	bool waitToComplete() ; @@ -318,7 +318,7 @@ public:  private:  	void easyFree(LLCurl::Easy*); -	void cleanup() ; +	void cleanup(bool deleted = false) ;  	CURLM* mCurlMultiHandle; @@ -333,6 +333,7 @@ private:  	ePerformState mState;  	BOOL mDead ; +	BOOL mValid ;  	LLMutex* mMutexp ;  	LLMutex* mDeletionMutexp ;  	LLMutex* mEasyMutexp ;  | 
