add mutex to protect curl_multi-init()

master
Xiaohong Bao 2011-12-20 15:02:21 -07:00
parent cfc6ac76e1
commit ec06aa129f
2 changed files with 19 additions and 3 deletions

View File

@ -517,7 +517,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,
}
////////////////////////////////////////////////////////////////////////////
LLMutex* LLCurl::Multi::sMultiInitMutexp = NULL ;
LLCurl::Multi::Multi()
: mQueued(0),
mErrorCount(0),
@ -527,11 +527,11 @@ LLCurl::Multi::Multi()
mDeletionMutexp(NULL),
mEasyMutexp(NULL)
{
mCurlMultiHandle = curl_multi_init();
mCurlMultiHandle = initMulti();
if (!mCurlMultiHandle)
{
llwarns << "curl_multi_init() returned NULL! Easy handles: " << gCurlEasyCount << " Multi handles: " << gCurlMultiCount << llendl;
mCurlMultiHandle = curl_multi_init();
mCurlMultiHandle = initMulti();
}
llassert_always(mCurlMultiHandle);
@ -576,6 +576,13 @@ LLCurl::Multi::~Multi()
--gCurlMultiCount;
}
CURLM* LLCurl::Multi::initMulti()
{
LLMutexLock lock(sMultiInitMutexp) ;
return curl_multi_init() ;
}
void LLCurl::Multi::lock()
{
if(mMutexp)
@ -853,11 +860,17 @@ void LLCurlThread::CurlRequest::finishRequest(bool completed)
LLCurlThread::LLCurlThread(bool threaded) :
LLQueuedThread("curlthread", threaded)
{
if(!LLCurl::Multi::sMultiInitMutexp)
{
LLCurl::Multi::sMultiInitMutexp = new LLMutex(NULL) ;
}
}
//virtual
LLCurlThread::~LLCurlThread()
{
delete LLCurl::Multi::sMultiInitMutexp ;
LLCurl::Multi::sMultiInitMutexp = NULL ;
}
S32 LLCurlThread::update(U32 max_time_ms)

View File

@ -299,6 +299,7 @@ public:
S32 mQueued;
S32 mErrorCount;
static CURLM* initMulti() ;
private:
void easyFree(LLCurl::Easy*);
@ -318,6 +319,8 @@ private:
LLMutex* mMutexp ;
LLMutex* mDeletionMutexp ;
LLMutex* mEasyMutexp ;
static LLMutex* sMultiInitMutexp ;
};
class LLCurlThread : public LLQueuedThread