LLCurlRequest::~LLCurlRequest() { llassert_always(mThreadID == LLThread::currentID()); //stop all Multi handle background threads for (curlmulti_set_t::iterator iter = mMultiSet.begin(); iter != mMultiSet.end(); ++iter) { LLCurl::Multi* multi = *iter; if (multi->mThreaded) multi->mSignal->lock(); multi->mQuitting = true; if (multi->mThreaded) { while (!multi->isStopped()) { multi->mSignal->signal(); multi->mSignal->unlock(); apr_sleep(1000); multi->mSignal->lock(); } } if (multi->mThreaded) multi->mSignal->unlock(); } for_each(mMultiSet.begin(), mMultiSet.end(), DeletePointer()); }
// Note: call once per frame S32 LLCurlRequest::process() { llassert_always(mThreadID == LLThread::currentID()); S32 res = 0; mProcessing = TRUE; for (curlmulti_set_t::iterator iter = mMultiSet.begin(); iter != mMultiSet.end(); ) { curlmulti_set_t::iterator curiter = iter++; LLCurl::Multi* multi = *curiter; S32 tres = multi->process(); res += tres; if (multi != mActiveMulti && tres == 0 && multi->mQueued == 0) { mMultiSet.erase(curiter); if (multi->mThreaded) multi->mSignal->lock(); multi->mQuitting = true; if (multi->mThreaded) { while (!multi->isStopped()) { multi->mSignal->signal(); multi->mSignal->unlock(); apr_sleep(1000); multi->mSignal->unlock(); } } if (multi->mThreaded) multi->mSignal->unlock(); delete multi; } } mProcessing = FALSE; return res; }