diff options
Diffstat (limited to 'indra/llmessage')
| -rw-r--r-- | indra/llmessage/llassetstorage.cpp | 2 | ||||
| -rw-r--r-- | indra/llmessage/llcurl.cpp | 132 | ||||
| -rw-r--r-- | indra/llmessage/llcurl.h | 3 | ||||
| -rwxr-xr-x | indra/llmessage/llsdmessagebuilder.cpp | 1 | ||||
| -rw-r--r-- | indra/llmessage/lltemplatemessagebuilder.cpp | 1 | ||||
| -rw-r--r-- | indra/llmessage/lltemplatemessagereader.cpp | 1 | ||||
| -rw-r--r-- | indra/llmessage/lltransfermanager.cpp | 2 | ||||
| -rw-r--r-- | indra/llmessage/lltransfersourceasset.cpp | 1 | 
8 files changed, 135 insertions, 8 deletions
| diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp index 970b6747f7..468dfaf397 100644 --- a/indra/llmessage/llassetstorage.cpp +++ b/indra/llmessage/llassetstorage.cpp @@ -546,7 +546,7 @@ void LLAssetStorage::_queueDataRequest(const LLUUID& uuid, LLAssetType::EType at  			tpvf.setAsset(uuid, atype);  			tpvf.setCallback(downloadCompleteCallback, req); -			llinfos << "Starting transfer for " << uuid << llendl; +			//llinfos << "Starting transfer for " << uuid << llendl;  			LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(mUpstreamHost, LLTCT_ASSET);  			ttcp->requestTransfer(spa, tpvf, 100.f + (is_priority ? 1.f : 0.f));  		} diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index ac50411de8..b0ebc7ea11 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -55,6 +55,7 @@  #include "llstl.h"  #include "llsdserialize.h"  #include "llthread.h" +#include "lltimer.h"  //////////////////////////////////////////////////////////////////////////////  /* @@ -240,7 +241,12 @@ public:  	void resetState(); +	static CURL* allocEasyHandle(); +	static void releaseEasyHandle(CURL* handle); +  private:	 +	friend class LLCurl; +  	CURL*				mCurlEasyHandle;  	struct curl_slist*	mHeaders; @@ -255,8 +261,62 @@ private:  	std::vector<char*>	mStrings;  	ResponderPtr		mResponder; + +	static std::set<CURL*> sFreeHandles; +	static std::set<CURL*> sActiveHandles; +	static LLMutex* sHandleMutex;  }; +std::set<CURL*> LLCurl::Easy::sFreeHandles; +std::set<CURL*> LLCurl::Easy::sActiveHandles; +LLMutex* LLCurl::Easy::sHandleMutex = NULL; + + +//static +CURL* LLCurl::Easy::allocEasyHandle() +{ +	CURL* ret = NULL; +	LLMutexLock lock(sHandleMutex); +	if (sFreeHandles.empty()) +	{ +		ret = curl_easy_init(); +	} +	else +	{ +		ret = *(sFreeHandles.begin()); +		sFreeHandles.erase(ret); +		curl_easy_reset(ret); +	} + +	if (ret) +	{ +		sActiveHandles.insert(ret); +	} + +	return ret; +} + +//static +void LLCurl::Easy::releaseEasyHandle(CURL* handle) +{ +	if (!handle) +	{ +		llerrs << "handle cannot be NULL!" << llendl; +	} + +	LLMutexLock lock(sHandleMutex); +	 +	if (sActiveHandles.find(handle) != sActiveHandles.end()) +	{ +		sActiveHandles.erase(handle); +		sFreeHandles.insert(handle); +	} +	else +	{ +		llerrs << "Invalid handle." << llendl; +	} +} +  LLCurl::Easy::Easy()  	: mHeaders(NULL),  	  mCurlEasyHandle(NULL) @@ -267,25 +327,27 @@ LLCurl::Easy::Easy()  LLCurl::Easy* LLCurl::Easy::getEasy()  {  	Easy* easy = new Easy(); -	easy->mCurlEasyHandle = curl_easy_init(); +	easy->mCurlEasyHandle = allocEasyHandle();  +	  	if (!easy->mCurlEasyHandle)  	{  		// this can happen if we have too many open files (fails in c-ares/ares_init.c) -		llwarns << "curl_multi_init() returned NULL! Easy handles: " << gCurlEasyCount << " Multi handles: " << gCurlMultiCount << llendl; +		llwarns << "allocEasyHandle() returned NULL! Easy handles: " << gCurlEasyCount << " Multi handles: " << gCurlMultiCount << llendl;  		delete easy;  		return NULL;  	} -	// set no DMS caching as default for all easy handles. This prevents them adopting a +	// set no DNS caching as default for all easy handles. This prevents them adopting a  	// multi handles cache if they are added to one.  	curl_easy_setopt(easy->mCurlEasyHandle, CURLOPT_DNS_CACHE_TIMEOUT, 0); +  	++gCurlEasyCount;  	return easy;  }  LLCurl::Easy::~Easy()  { -	curl_easy_cleanup(mCurlEasyHandle); +	releaseEasyHandle(mCurlEasyHandle);  	--gCurlEasyCount;  	curl_slist_free_all(mHeaders);  	for_each(mStrings.begin(), mStrings.end(), DeletePointerArray()); @@ -363,6 +425,7 @@ U32 LLCurl::Easy::report(CURLcode code)  	{  		responseCode = 499;  		responseReason = strerror(code) + " : " + mErrorBuffer; +		setopt(CURLOPT_FRESH_CONNECT, TRUE);  	}  	if (mResponder) @@ -449,7 +512,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,  	if (post) setoptString(CURLOPT_ENCODING, ""); -//	setopt(CURLOPT_VERBOSE, 1); // usefull for debugging +	//setopt(CURLOPT_VERBOSE, 1); // usefull for debugging  	setopt(CURLOPT_NOSIGNAL, 1);  	mOutput.reset(new LLBufferArray); @@ -473,6 +536,9 @@ void LLCurl::Easy::prepRequest(const std::string& url,  	setCA();  	setopt(CURLOPT_SSL_VERIFYPEER, true); +	 +	//don't verify host name so urls with scrubbed host names will work (improves DNS performance) +	setopt(CURLOPT_SSL_VERIFYHOST, 0);  	setopt(CURLOPT_TIMEOUT, CURL_REQUEST_TIMEOUT);  	setoptString(CURLOPT_URL, url); @@ -533,6 +599,7 @@ LLCurl::Multi::Multi()  	  mErrorCount(0)  {  	mCurlMultiHandle = curl_multi_init(); +	  	if (!mCurlMultiHandle)  	{  		llwarns << "curl_multi_init() returned NULL! Easy handles: " << gCurlEasyCount << " Multi handles: " << gCurlMultiCount << llendl; @@ -700,6 +767,7 @@ LLCurlRequest::LLCurlRequest() :  	mActiveRequestCount(0)  {  	mThreadID = LLThread::currentID(); +	mProcessing = FALSE;  }  LLCurlRequest::~LLCurlRequest() @@ -734,6 +802,11 @@ LLCurl::Easy* LLCurlRequest::allocEasy()  bool LLCurlRequest::addEasy(LLCurl::Easy* easy)  {  	llassert_always(mActiveMulti); +	 +	if (mProcessing) +	{ +		llerrs << "Posting to a LLCurlRequest instance from within a responder is not allowed (causes DNS timeouts)." << llendl; +	}  	bool res = mActiveMulti->addEasy(easy);  	return res;  } @@ -791,12 +864,41 @@ bool LLCurlRequest::post(const std::string& url,  	bool res = addEasy(easy);  	return res;  } + +bool LLCurlRequest::post(const std::string& url, +						 const headers_t& headers, +						 const std::string& data, +						 LLCurl::ResponderPtr responder) +{ +	LLCurl::Easy* easy = allocEasy(); +	if (!easy) +	{ +		return false; +	} +	easy->prepRequest(url, headers, responder); + +	easy->getInput().write(data.data(), data.size()); +	S32 bytes = easy->getInput().str().length(); +	easy->setopt(CURLOPT_POST, 1); +	easy->setopt(CURLOPT_POSTFIELDS, (void*)NULL); +	easy->setopt(CURLOPT_POSTFIELDSIZE, bytes); + +	easy->slist_append("Content-Type: application/octet-stream"); +	easy->setHeaders(); + +	lldebugs << "POSTING: " << bytes << " bytes." << llendl; +	bool res = addEasy(easy); +	return res; +} +  // 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(); )  	{ @@ -810,6 +912,7 @@ S32 LLCurlRequest::process()  			delete multi;  		}  	} +	mProcessing = FALSE;  	return res;  } @@ -1041,6 +1144,8 @@ void LLCurl::initClass()  	// - http://curl.haxx.se/libcurl/c/curl_global_init.html  	curl_global_init(CURL_GLOBAL_ALL); +	Easy::sHandleMutex = new LLMutex(NULL); +  #if SAFE_SSL  	S32 mutex_count = CRYPTO_num_locks();  	for (S32 i=0; i<mutex_count; i++) @@ -1058,7 +1163,22 @@ void LLCurl::cleanupClass()  	CRYPTO_set_locking_callback(NULL);  	for_each(sSSLMutex.begin(), sSSLMutex.end(), DeletePointer());  #endif -	curl_global_cleanup(); + +	delete Easy::sHandleMutex; +	Easy::sHandleMutex = NULL; + +	for (std::set<CURL*>::iterator iter = Easy::sFreeHandles.begin(); iter != Easy::sFreeHandles.end(); ++iter) +	{ +		CURL* curl = *iter; +		curl_easy_cleanup(curl); +	} + +	Easy::sFreeHandles.clear(); + +	if (!Easy::sActiveHandles.empty()) +	{ +		llerrs << "CURL easy handles not cleaned up on shutdown!" << llendl; +	}  }  const unsigned int LLCurl::MAX_REDIRECTS = 5; diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h index 20ca87c87b..ba51823fd3 100644 --- a/indra/llmessage/llcurl.h +++ b/indra/llmessage/llcurl.h @@ -208,6 +208,8 @@ public:  	void get(const std::string& url, LLCurl::ResponderPtr responder);  	bool getByteRange(const std::string& url, const headers_t& headers, S32 offset, S32 length, LLCurl::ResponderPtr responder);  	bool post(const std::string& url, const headers_t& headers, const LLSD& data, LLCurl::ResponderPtr responder); +	bool post(const std::string& url, const headers_t& headers, const std::string& data, LLCurl::ResponderPtr responder); +	  	S32  process();  	S32  getQueued(); @@ -221,6 +223,7 @@ private:  	curlmulti_set_t mMultiSet;  	LLCurl::Multi* mActiveMulti;  	S32 mActiveRequestCount; +	BOOL mProcessing;  	U32 mThreadID; // debug  }; diff --git a/indra/llmessage/llsdmessagebuilder.cpp b/indra/llmessage/llsdmessagebuilder.cpp index 6e41b03895..2680dd0b77 100755 --- a/indra/llmessage/llsdmessagebuilder.cpp +++ b/indra/llmessage/llsdmessagebuilder.cpp @@ -35,6 +35,7 @@  #include "llsdmessagebuilder.h"  #include "llmessagetemplate.h" +#include "llmath.h"  #include "llquaternion.h"  #include "llsdutil.h"  #include "llsdutil_math.h" diff --git a/indra/llmessage/lltemplatemessagebuilder.cpp b/indra/llmessage/lltemplatemessagebuilder.cpp index fa02456d90..6f9707ed57 100644 --- a/indra/llmessage/lltemplatemessagebuilder.cpp +++ b/indra/llmessage/lltemplatemessagebuilder.cpp @@ -35,6 +35,7 @@  #include "lltemplatemessagebuilder.h"  #include "llmessagetemplate.h" +#include "llmath.h"  #include "llquaternion.h"  #include "u64.h"  #include "v3dmath.h" diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp index 8f56cf2521..2b67e9f6fa 100644 --- a/indra/llmessage/lltemplatemessagereader.cpp +++ b/indra/llmessage/lltemplatemessagereader.cpp @@ -36,6 +36,7 @@  #include "llfasttimer.h"  #include "llmessagebuilder.h"  #include "llmessagetemplate.h" +#include "llmath.h"  #include "llquaternion.h"  #include "message.h"  #include "u64.h" diff --git a/indra/llmessage/lltransfermanager.cpp b/indra/llmessage/lltransfermanager.cpp index d64b666ede..de9c609500 100644 --- a/indra/llmessage/lltransfermanager.cpp +++ b/indra/llmessage/lltransfermanager.cpp @@ -344,7 +344,7 @@ void LLTransferManager::processTransferInfo(LLMessageSystem *msgp, void **)  		}  	} -	llinfos << "Receiving " << transfer_id << ", size " << size << " bytes" << llendl; +	//llinfos << "Receiving " << transfer_id << ", size " << size << " bytes" << llendl;  	ttp->setSize(size);  	ttp->setGotInfo(TRUE); diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp index 43f7c07e94..8c0520687a 100644 --- a/indra/llmessage/lltransfersourceasset.cpp +++ b/indra/llmessage/lltransfersourceasset.cpp @@ -257,3 +257,4 @@ BOOL LLTransferSourceParamsAsset::unpackParams(LLDataPacker &dp)  	return TRUE;  } + | 
