Skip to content
Snippets Groups Projects
Commit 7b6afd1e authored by David Parks's avatar David Parks
Browse files

SH-2031 Followup to curl threading work -- don't start and stop the thread on...

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)
parent 764a13a1
No related branches found
No related tags found
No related merge requests found
...@@ -611,6 +611,9 @@ class LLCurl::Multi : public LLThread ...@@ -611,6 +611,9 @@ class LLCurl::Multi : public LLThread
S32 mPerformState; S32 mPerformState;
LLCondition* mSignal;
bool mQuitting;
private: private:
void easyFree(Easy*); void easyFree(Easy*);
...@@ -630,6 +633,9 @@ LLCurl::Multi::Multi() ...@@ -630,6 +633,9 @@ LLCurl::Multi::Multi()
mErrorCount(0), mErrorCount(0),
mPerformState(PERFORM_STATE_READY) mPerformState(PERFORM_STATE_READY)
{ {
mQuitting = false;
mSignal = new LLCondition(NULL);
mCurlMultiHandle = curl_multi_init(); mCurlMultiHandle = curl_multi_init();
if (!mCurlMultiHandle) if (!mCurlMultiHandle)
{ {
...@@ -644,6 +650,10 @@ LLCurl::Multi::Multi() ...@@ -644,6 +650,10 @@ LLCurl::Multi::Multi()
LLCurl::Multi::~Multi() LLCurl::Multi::~Multi()
{ {
llassert(isStopped()); llassert(isStopped());
delete mSignal;
mSignal = NULL;
// Clean up active // Clean up active
for(easy_active_list_t::iterator iter = mEasyActiveList.begin(); for(easy_active_list_t::iterator iter = mEasyActiveList.begin();
iter != mEasyActiveList.end(); ++iter) iter != mEasyActiveList.end(); ++iter)
...@@ -674,27 +684,31 @@ void LLCurl::Multi::perform() ...@@ -674,27 +684,31 @@ void LLCurl::Multi::perform()
if (mPerformState == PERFORM_STATE_READY) if (mPerformState == PERFORM_STATE_READY)
{ {
mPerformState = PERFORM_STATE_PERFORMING; mPerformState = PERFORM_STATE_PERFORMING;
start(); mSignal->signal();
} }
} }
void LLCurl::Multi::run() void LLCurl::Multi::run()
{ {
S32 q = 0; while (!mQuitting)
for (S32 call_count = 0;
call_count < MULTI_PERFORM_CALL_REPEAT;
call_count += 1)
{ {
CURLMcode code = curl_multi_perform(mCurlMultiHandle, &q); mSignal->wait();
if (CURLM_CALL_MULTI_PERFORM != code || q == 0) S32 q = 0;
for (S32 call_count = 0;
call_count < MULTI_PERFORM_CALL_REPEAT;
call_count += 1)
{ {
check_curl_multi_code(code); CURLMcode code = curl_multi_perform(mCurlMultiHandle, &q);
break; 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() S32 LLCurl::Multi::process()
...@@ -823,6 +837,7 @@ void LLCurlRequest::addMulti() ...@@ -823,6 +837,7 @@ void LLCurlRequest::addMulti()
{ {
llassert_always(mThreadID == LLThread::currentID()); llassert_always(mThreadID == LLThread::currentID());
LLCurl::Multi* multi = new LLCurl::Multi(); LLCurl::Multi* multi = new LLCurl::Multi();
multi->start();
mMultiSet.insert(multi); mMultiSet.insert(multi);
mActiveMulti = multi; mActiveMulti = multi;
mActiveRequestCount = 0; mActiveRequestCount = 0;
...@@ -952,9 +967,10 @@ S32 LLCurlRequest::process() ...@@ -952,9 +967,10 @@ S32 LLCurlRequest::process()
if (multi != mActiveMulti && tres == 0 && multi->mQueued == 0) if (multi != mActiveMulti && tres == 0 && multi->mQueued == 0)
{ {
mMultiSet.erase(curiter); mMultiSet.erase(curiter);
multi->mQuitting = true;
while (!multi->isStopped()) while (!multi->isStopped())
{ {
multi->mSignal->signal();
apr_sleep(1000); apr_sleep(1000);
} }
...@@ -988,6 +1004,7 @@ LLCurlEasyRequest::LLCurlEasyRequest() ...@@ -988,6 +1004,7 @@ LLCurlEasyRequest::LLCurlEasyRequest()
mResultReturned(false) mResultReturned(false)
{ {
mMulti = new LLCurl::Multi(); mMulti = new LLCurl::Multi();
mMulti->start();
mEasy = mMulti->allocEasy(); mEasy = mMulti->allocEasy();
if (mEasy) if (mEasy)
{ {
...@@ -998,8 +1015,10 @@ LLCurlEasyRequest::LLCurlEasyRequest() ...@@ -998,8 +1015,10 @@ LLCurlEasyRequest::LLCurlEasyRequest()
LLCurlEasyRequest::~LLCurlEasyRequest() LLCurlEasyRequest::~LLCurlEasyRequest()
{ {
mMulti->mQuitting = true;
while (!mMulti->isStopped()) while (!mMulti->isStopped())
{ {
mMulti->mSignal->signal();
apr_sleep(1000); apr_sleep(1000);
} }
delete mMulti; delete mMulti;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment