fix for sh-2738: Texture fetching freezes due to LLcurl

meow-7.2.2
Xiaohong Bao 2011-12-05 13:23:05 -07:00
parent 8f0f480612
commit 09feaac844
2 changed files with 34 additions and 31 deletions

View File

@ -187,11 +187,18 @@ public:
LLMutexLock(LLMutex* mutex)
{
mMutex = mutex;
mMutex->lock();
if(mMutex)
{
mMutex->lock();
}
}
~LLMutexLock()
{
mMutex->unlock();
if(mMutex)
{
mMutex->unlock();
}
}
private:
LLMutex* mMutex;

View File

@ -585,37 +585,30 @@ void LLCurl::Multi::unlock()
void LLCurl::Multi::markDead()
{
if(mDeletionMutexp)
{
mDeletionMutexp->lock() ;
}
LLMutexLock lock(mDeletionMutexp) ;
mDead = TRUE ;
if(mDeletionMutexp)
{
mDeletionMutexp->unlock() ;
}
}
void LLCurl::Multi::setState(LLCurl::Multi::ePerformState state)
{
lock() ;
LLMutexLock lock(mMutexp) ;
mState = state ;
if(mState == STATE_READY)
{
LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_NORMAL) ;
}
unlock() ;
}
LLCurl::Multi::ePerformState LLCurl::Multi::getState()
{
ePerformState state ;
lock() ;
state = mState ;
unlock() ;
{
LLMutexLock lock(mMutexp) ;
state = mState ;
}
return state ;
}
@ -635,13 +628,15 @@ bool LLCurl::Multi::waitToComplete()
bool completed ;
lock() ;
completed = (STATE_COMPLETED == mState) ;
if(!completed)
{
LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_URGENT) ;
LLMutexLock lock(mMutexp) ;
completed = (STATE_COMPLETED == mState) ;
if(!completed)
{
LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_URGENT) ;
}
}
unlock() ;
return completed;
}
@ -655,10 +650,8 @@ CURLMsg* LLCurl::Multi::info_read(S32* msgs_in_queue)
//return true if dead
bool LLCurl::Multi::doPerform()
{
if(mDeletionMutexp)
{
mDeletionMutexp->lock() ;
}
LLMutexLock lock(mDeletionMutexp) ;
bool dead = mDead ;
if(mDead)
@ -675,6 +668,8 @@ bool LLCurl::Multi::doPerform()
call_count < MULTI_PERFORM_CALL_REPEAT;
call_count++)
{
LLMutexLock lock(mMutexp) ;
CURLMcode code = curl_multi_perform(mCurlMultiHandle, &q);
if (CURLM_CALL_MULTI_PERFORM != code || q == 0)
{
@ -688,11 +683,6 @@ bool LLCurl::Multi::doPerform()
setState(STATE_COMPLETED) ;
}
if(mDeletionMutexp)
{
mDeletionMutexp->unlock() ;
}
return dead ;
}
@ -764,6 +754,8 @@ LLCurl::Easy* LLCurl::Multi::allocEasy()
bool LLCurl::Multi::addEasy(Easy* easy)
{
LLMutexLock lock(mMutexp) ;
CURLMcode mcode = curl_multi_add_handle(mCurlMultiHandle, easy->getCurlHandle());
check_curl_multi_code(mcode);
//if (mcode != CURLM_OK)
@ -776,6 +768,8 @@ bool LLCurl::Multi::addEasy(Easy* easy)
void LLCurl::Multi::easyFree(Easy* easy)
{
LLMutexLock lock(mMutexp) ;
mEasyActiveList.erase(easy);
mEasyActiveMap.erase(easy->getCurlHandle());
if (mEasyFreeList.size() < EASY_HANDLE_POOL_SIZE)
@ -791,6 +785,8 @@ void LLCurl::Multi::easyFree(Easy* easy)
void LLCurl::Multi::removeEasy(Easy* easy)
{
LLMutexLock lock(mMutexp) ;
check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle()));
easyFree(easy);
}