diff options
| -rw-r--r-- | indra/llmessage/llcurl.cpp | 43 | 
1 files changed, 32 insertions, 11 deletions
| diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index 05f3869a11..5027e8fa84 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -603,11 +603,12 @@ void LLCurl::Multi::setState(LLCurl::Multi::ePerformState state)  {  	lock() ;  	mState = state ; +	unlock() ; +  	if(mState == STATE_READY)  	{  		LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_NORMAL) ; -	} -	unlock() ; +	}	  }  LLCurl::Multi::ePerformState LLCurl::Multi::getState() @@ -628,9 +629,7 @@ bool LLCurl::Multi::waitToComplete()  		return true ;  	} -	bool completed ; - -	completed = (STATE_COMPLETED == mState) ; +	bool completed = (STATE_COMPLETED == mState) ;  	if(!completed)  	{  		LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_URGENT) ; @@ -641,6 +640,8 @@ bool LLCurl::Multi::waitToComplete()  CURLMsg* LLCurl::Multi::info_read(S32* msgs_in_queue)  { +	LLMutexLock lock(mMutexp) ; +  	CURLMsg* curlmsg = curl_multi_info_read(mCurlMultiHandle, msgs_in_queue);  	return curlmsg;  } @@ -706,10 +707,19 @@ S32 LLCurl::Multi::process()  		if (msg->msg == CURLMSG_DONE)  		{  			U32 response = 0; -			easy_active_map_t::iterator iter = mEasyActiveMap.find(msg->easy_handle); -			if (iter != mEasyActiveMap.end()) +			Easy* easy = NULL ; + +			{ +				LLMutexLock lock(mEasyMutexp) ; +				easy_active_map_t::iterator iter = mEasyActiveMap.find(msg->easy_handle); +				if (iter != mEasyActiveMap.end()) +				{ +					easy = iter->second; +				} +			} + +			if(easy)  			{ -				Easy* easy = iter->second;  				response = easy->report(msg->data.result);  				removeEasy(easy);  			} @@ -770,20 +780,31 @@ bool LLCurl::Multi::addEasy(Easy* easy)  void LLCurl::Multi::easyFree(Easy* easy)  { -	mEasyMutexp->lock() ; +	if(mEasyMutexp) +	{ +		mEasyMutexp->lock() ; +	} +  	mEasyActiveList.erase(easy);  	mEasyActiveMap.erase(easy->getCurlHandle());  	if (mEasyFreeList.size() < EASY_HANDLE_POOL_SIZE)  	{		  		mEasyFreeList.insert(easy); -		mEasyMutexp->unlock() ; +		 +		if(mEasyMutexp) +		{ +			mEasyMutexp->unlock() ; +		}  		easy->resetState();  	}  	else  	{ -		mEasyMutexp->unlock() ; +		if(mEasyMutexp) +		{ +			mEasyMutexp->unlock() ; +		}  		delete easy;  	}  } | 
