LLCurl::Multi::~Multi() { llassert(isStopped()); if (LLCurl::sMultiThreaded) { LLCurl::Easy::sMultiMutex->lock(); } delete mSignal; mSignal = NULL; // Clean up active for(easy_active_list_t::iterator iter = mEasyActiveList.begin(); iter != mEasyActiveList.end(); ++iter) { Easy* easy = *iter; check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle())); delete easy; } mEasyActiveList.clear(); mEasyActiveMap.clear(); // Clean up freed for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer()); mEasyFreeList.clear(); check_curl_multi_code(curl_multi_cleanup(mCurlMultiHandle)); --gCurlMultiCount; if (LLCurl::sMultiThreaded) { LLCurl::Easy::sMultiMutex->unlock(); } }
void LLCurl::Multi::cleanup(bool deleted) { if(!mCurlMultiHandle) { return ; //nothing to clean. } llassert_always(deleted || !mValid) ; LLMutexLock lock(mDeletionMutexp); // Clean up active for(easy_active_list_t::iterator iter = mEasyActiveList.begin(); iter != mEasyActiveList.end(); ++iter) { Easy* easy = *iter; check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle())); if(deleted) { easy->mResponder = NULL ; //avoid triggering mResponder. } delete easy; } mEasyActiveList.clear(); mEasyActiveMap.clear(); // Clean up freed for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer()); mEasyFreeList.clear(); check_curl_multi_code(LLCurl::deleteMultiHandle(mCurlMultiHandle)); mCurlMultiHandle = NULL ; delete mMutexp ; mMutexp = NULL ; delete mEasyMutexp ; mEasyMutexp = NULL ; mQueued = 0 ; mState = STATE_COMPLETED; --gCurlMultiCount; return ; }
LLCurl::Easy* LLCurl::Multi::allocEasy() { Easy* easy = 0; if (mEasyFreeList.empty()) { easy = Easy::getEasy(); } else { easy = *(mEasyFreeList.begin()); mEasyFreeList.erase(easy); } if (easy) { mEasyActiveList.insert(easy); mEasyActiveMap[easy->getCurlHandle()] = easy; } return easy; }
LLCurl::Multi::~Multi() { // Clean up active for(easy_active_list_t::iterator iter = mEasyActiveList.begin(); iter != mEasyActiveList.end(); ++iter) { Easy* easy = *iter; curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle()); delete easy; } mEasyActiveList.clear(); mEasyActiveMap.clear(); // Clean up freed for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer()); mEasyFreeList.clear(); curl_multi_cleanup(mCurlMultiHandle); --gCurlMultiCount; }
void LLCurl::Multi::cleanup() { if(!mCurlMultiHandle) { return ; //nothing to clean. } // Clean up active for(easy_active_list_t::iterator iter = mEasyActiveList.begin(); iter != mEasyActiveList.end(); ++iter) { Easy* easy = *iter; check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle())); delete easy; } mEasyActiveList.clear(); mEasyActiveMap.clear(); // Clean up freed for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer()); mEasyFreeList.clear(); check_curl_multi_code(LLCurl::deleteMultiHandle(mCurlMultiHandle)); mCurlMultiHandle = NULL ; delete mMutexp ; mMutexp = NULL ; delete mDeletionMutexp ; mDeletionMutexp = NULL ; delete mEasyMutexp ; mEasyMutexp = NULL ; mQueued = 0 ; mState = STATE_COMPLETED; --gCurlMultiCount; return ; }