diff options
Diffstat (limited to 'indra/llcorehttp')
| -rwxr-xr-x | indra/llcorehttp/_httplibcurl.cpp | 32 | ||||
| -rwxr-xr-x | indra/llcorehttp/_httplibcurl.h | 1 | ||||
| -rwxr-xr-x | indra/llcorehttp/_httppolicy.cpp | 11 | 
3 files changed, 26 insertions, 18 deletions
| diff --git a/indra/llcorehttp/_httplibcurl.cpp b/indra/llcorehttp/_httplibcurl.cpp index b079dff864..0cb4e9d8b7 100755 --- a/indra/llcorehttp/_httplibcurl.cpp +++ b/indra/llcorehttp/_httplibcurl.cpp @@ -41,7 +41,8 @@ namespace LLCore  HttpLibcurl::HttpLibcurl(HttpService * service)  	: mService(service),  	  mPolicyCount(0), -	  mMultiHandles(NULL) +	  mMultiHandles(NULL), +	  mActiveHandles(NULL)  {} @@ -77,6 +78,9 @@ void HttpLibcurl::shutdown()  		delete [] mMultiHandles;  		mMultiHandles = NULL; + +		delete [] mActiveHandles; +		mActiveHandles = NULL;  	}  	mPolicyCount = 0; @@ -90,9 +94,12 @@ void HttpLibcurl::start(int policy_count)  	mPolicyCount = policy_count;  	mMultiHandles = new CURLM * [mPolicyCount]; +	mActiveHandles = new int [mPolicyCount]; +	  	for (int policy_class(0); policy_class < mPolicyCount; ++policy_class)  	{  		mMultiHandles[policy_class] = curl_multi_init(); +		mActiveHandles[policy_class] = 0;  	}  } @@ -110,8 +117,10 @@ HttpService::ELoopSpeed HttpLibcurl::processTransport()  	// Give libcurl some cycles to do I/O & callbacks  	for (int policy_class(0); policy_class < mPolicyCount; ++policy_class)  	{ -		if (! mMultiHandles[policy_class]) +		if (! mActiveHandles[policy_class] || ! mMultiHandles[policy_class]) +		{  			continue; +		}  		int running(0);  		CURLMcode status(CURLM_CALL_MULTI_PERFORM); @@ -191,6 +200,7 @@ void HttpLibcurl::addOp(HttpOpRequest * op)  	// On success, make operation active  	mActiveOps.insert(op); +	++mActiveHandles[op->mReqPolicy];  } @@ -212,6 +222,7 @@ bool HttpLibcurl::cancel(HttpHandle handle)  	// Drop references  	mActiveOps.erase(it); +	--mActiveHandles[op->mReqPolicy];  	op->release();  	return true; @@ -273,6 +284,7 @@ bool HttpLibcurl::completeRequest(CURLM * multi_handle, CURL * handle, CURLcode  	// Deactivate request  	mActiveOps.erase(it); +	--mActiveHandles[op->mReqPolicy];  	op->mCurlActive = false;  	// Set final status of request if it hasn't failed by other mechanisms yet @@ -334,19 +346,9 @@ int HttpLibcurl::getActiveCount() const  int HttpLibcurl::getActiveCountInClass(int policy_class) const  { -	int count(0); -	 -	for (active_set_t::const_iterator iter(mActiveOps.begin()); -		 mActiveOps.end() != iter; -		 ++iter) -	{ -		if ((*iter)->mReqPolicy == policy_class) -		{ -			++count; -		} -	} -	 -	return count; +	llassert_always(policy_class < mPolicyCount); + +	return mActiveHandles ? mActiveHandles[policy_class] : 0;  } diff --git a/indra/llcorehttp/_httplibcurl.h b/indra/llcorehttp/_httplibcurl.h index 0ec90437bb..67f98dd4f0 100755 --- a/indra/llcorehttp/_httplibcurl.h +++ b/indra/llcorehttp/_httplibcurl.h @@ -133,6 +133,7 @@ protected:  	active_set_t		mActiveOps;  	int					mPolicyCount;  	CURLM **			mMultiHandles;			// One handle per policy class +	int *				mActiveHandles;			// Active count per policy class  }; // end class HttpLibcurl  }  // end namespace LLCore diff --git a/indra/llcorehttp/_httppolicy.cpp b/indra/llcorehttp/_httppolicy.cpp index 808eebc6cc..c4758aee88 100755 --- a/indra/llcorehttp/_httppolicy.cpp +++ b/indra/llcorehttp/_httppolicy.cpp @@ -212,6 +212,14 @@ HttpService::ELoopSpeed HttpPolicy::processReadyQueue()  	for (int policy_class(0); policy_class < mClasses.size(); ++policy_class)  	{  		ClassState & state(*mClasses[policy_class]); +		HttpRetryQueue & retryq(state.mRetryQueue); +		HttpReadyQueue & readyq(state.mReadyQueue); + +		if (retryq.empty() && readyq.empty()) +		{ +			continue; +		} +		  		const bool throttle_enabled(state.mOptions.mThrottleRate > 0L);  		const bool throttle_current(throttle_enabled && now < state.mThrottleEnd); @@ -225,9 +233,6 @@ HttpService::ELoopSpeed HttpPolicy::processReadyQueue()  		int active(transport.getActiveCountInClass(policy_class));  		int needed(state.mOptions.mConnectionLimit - active);		// Expect negatives here -		HttpRetryQueue & retryq(state.mRetryQueue); -		HttpReadyQueue & readyq(state.mReadyQueue); -  		if (needed > 0)  		{  			// First see if we have any retries... | 
