SH-2031 Followup to curl threading work -- don't start and stop the thread on every request, use a signal (cuts time spent in Pump IO down from 1-2 ms to 0.1ms)

meow-7.2.2
Dave Parks 2011-07-21 23:33:23 -05:00
parent 764a13a196
commit 7b6afd1eba
1 changed files with 32 additions and 13 deletions

View File

@ -611,6 +611,9 @@ public:
S32 mPerformState;
LLCondition* mSignal;
bool mQuitting;
private:
void easyFree(Easy*);
@ -630,6 +633,9 @@ LLCurl::Multi::Multi()
mErrorCount(0),
mPerformState(PERFORM_STATE_READY)
{
mQuitting = false;
mSignal = new LLCondition(NULL);
mCurlMultiHandle = curl_multi_init();
if (!mCurlMultiHandle)
{
@ -644,6 +650,10 @@ LLCurl::Multi::Multi()
LLCurl::Multi::~Multi()
{
llassert(isStopped());
delete mSignal;
mSignal = NULL;
// Clean up active
for(easy_active_list_t::iterator iter = mEasyActiveList.begin();
iter != mEasyActiveList.end(); ++iter)
@ -674,27 +684,31 @@ void LLCurl::Multi::perform()
if (mPerformState == PERFORM_STATE_READY)
{
mPerformState = PERFORM_STATE_PERFORMING;
start();
mSignal->signal();
}
}
void LLCurl::Multi::run()
{
S32 q = 0;
for (S32 call_count = 0;
call_count < MULTI_PERFORM_CALL_REPEAT;
call_count += 1)
while (!mQuitting)
{
CURLMcode code = curl_multi_perform(mCurlMultiHandle, &q);
if (CURLM_CALL_MULTI_PERFORM != code || q == 0)
mSignal->wait();
S32 q = 0;
for (S32 call_count = 0;
call_count < MULTI_PERFORM_CALL_REPEAT;
call_count += 1)
{
check_curl_multi_code(code);
break;
}
CURLMcode code = curl_multi_perform(mCurlMultiHandle, &q);
if (CURLM_CALL_MULTI_PERFORM != code || q == 0)
{
check_curl_multi_code(code);
break;
}
}
mQueued = q;
mPerformState = PERFORM_STATE_COMPLETED;
}
mQueued = q;
mPerformState = PERFORM_STATE_COMPLETED;
}
S32 LLCurl::Multi::process()
@ -823,6 +837,7 @@ void LLCurlRequest::addMulti()
{
llassert_always(mThreadID == LLThread::currentID());
LLCurl::Multi* multi = new LLCurl::Multi();
multi->start();
mMultiSet.insert(multi);
mActiveMulti = multi;
mActiveRequestCount = 0;
@ -952,9 +967,10 @@ S32 LLCurlRequest::process()
if (multi != mActiveMulti && tres == 0 && multi->mQueued == 0)
{
mMultiSet.erase(curiter);
multi->mQuitting = true;
while (!multi->isStopped())
{
multi->mSignal->signal();
apr_sleep(1000);
}
@ -988,6 +1004,7 @@ LLCurlEasyRequest::LLCurlEasyRequest()
mResultReturned(false)
{
mMulti = new LLCurl::Multi();
mMulti->start();
mEasy = mMulti->allocEasy();
if (mEasy)
{
@ -998,8 +1015,10 @@ LLCurlEasyRequest::LLCurlEasyRequest()
LLCurlEasyRequest::~LLCurlEasyRequest()
{
mMulti->mQuitting = true;
while (!mMulti->isStopped())
{
mMulti->mSignal->signal();
apr_sleep(1000);
}
delete mMulti;