diff options
| -rw-r--r-- | indra/newview/llfolderview.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llfolderviewitem.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llinventoryfilter.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llinventorymodelbackgroundfetch.cpp | 170 | ||||
| -rw-r--r-- | indra/newview/llinventorymodelbackgroundfetch.h | 4 | ||||
| -rw-r--r-- | indra/newview/llinventorypanel.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llpanelmaininventory.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llviewerinventory.cpp | 5 | 
9 files changed, 108 insertions, 84 deletions
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 2249f61435..86001e4146 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -912,7 +912,7 @@ void LLFolderView::draw()  	}  	else if (mShowEmptyMessage)  	{ -		if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration()) +		if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())  		{  			mStatusText = LLTrans::getString("Searching");  		} @@ -1966,7 +1966,7 @@ void LLFolderView::scrollToShowSelection()  	// However we allow scrolling for folder views with mAutoSelectOverride  	// (used in Places SP) as an exception because the selection in them  	// is not reset during items filtering. See STORM-133. -	if ( (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mAutoSelectOverride) +	if ( (!LLInventoryModelBackgroundFetch::instance().folderFetchActive() || mAutoSelectOverride)  			&& mSelectedItems.size() )  	{  		mNeedsScroll = TRUE; diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 734adbc648..afad27b4e0 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -1045,7 +1045,7 @@ void LLFolderViewItem::draw()  	}  	if ((mIsLoading  		&&	mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime")) -			||	(LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() +			||	(LLInventoryModelBackgroundFetch::instance().folderFetchActive()  				&&	root_is_loading  				&&	mShowLoadStatus))  	{ diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 257ceed912..daebfb5c86 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1324,6 +1324,7 @@ void LLItemBridge::selectItem()  	LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem());  	if(item && !item->isFinished())  	{ +		//item->fetchFromServer();  		LLInventoryModelBackgroundFetch::instance().start(item->getUUID(), false);  	}  } diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 796251cae5..f818e33726 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -888,7 +888,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() +	if (!LLInventoryModelBackgroundFetch::instance().folderFetchActive()  		&& filtered_by_type  		&& !filtered_by_all_types)  	{ diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index cb140cf15c..f4d0110b0f 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -43,6 +43,7 @@ const S32 MAX_FETCH_RETRIES = 10;  LLInventoryModelBackgroundFetch::LLInventoryModelBackgroundFetch() :  	mBackgroundFetchActive(FALSE), +	mFolderFetchActive(false),  	mAllFoldersFetched(FALSE),  	mRecursiveInventoryFetchStarted(FALSE),  	mRecursiveLibraryFetchStarted(FALSE), @@ -98,19 +99,20 @@ bool LLInventoryModelBackgroundFetch::isEverythingFetched() const  	return mAllFoldersFetched;  } -BOOL LLInventoryModelBackgroundFetch::backgroundFetchActive() const +BOOL LLInventoryModelBackgroundFetch::folderFetchActive() const  { -	return mBackgroundFetchActive; +	return mFolderFetchActive;  }  void LLInventoryModelBackgroundFetch::start(const LLUUID& id, BOOL recursive)  {  	LLViewerInventoryCategory* cat = gInventory.getCategory(id); -	if (cat || (id.isNull() && !mAllFoldersFetched)) +	if (cat || (id.isNull() && !isEverythingFetched()))  	{	// it's a folder, do a bulk fetch  		LL_DEBUGS("InventoryFetch") << "Start fetching category: " << id << ", recursive: " << recursive << LL_ENDL;  		mBackgroundFetchActive = TRUE; +		mFolderFetchActive = true;  		if (id.isNull())  		{  			if (!mRecursiveInventoryFetchStarted) @@ -159,21 +161,11 @@ void LLInventoryModelBackgroundFetch::start(const LLUUID& id, BOOL recursive)  void LLInventoryModelBackgroundFetch::findLostItems()  {  	mBackgroundFetchActive = TRUE; +	mFolderFetchActive = true;      mFetchQueue.push_back(FetchQueueInfo(LLUUID::null, TRUE));      gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);  } -void LLInventoryModelBackgroundFetch::stopBackgroundFetch() -{ -	if (mBackgroundFetchActive) -	{ -		mBackgroundFetchActive = FALSE; -		gIdleCallbacks.deleteFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); -		mFetchCount=0; -		mMinTimeBetweenFetches=0.0f; -	} -} -  void LLInventoryModelBackgroundFetch::setAllFoldersFetched()  {  	if (mRecursiveInventoryFetchStarted && @@ -181,7 +173,7 @@ void LLInventoryModelBackgroundFetch::setAllFoldersFetched()  	{  		mAllFoldersFetched = TRUE;  	} -	stopBackgroundFetch(); +	mFolderFetchActive = false;  }  void LLInventoryModelBackgroundFetch::backgroundFetchCB(void *) @@ -211,6 +203,9 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  			llinfos << "Inventory fetch completed" << llendl;  			setAllFoldersFetched(); +			mBackgroundFetchActive = false; +			mFolderFetchActive = false; +  			return;  		} @@ -240,80 +235,114 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  			}  			const FetchQueueInfo info = mFetchQueue.front(); -			LLViewerInventoryCategory* cat = gInventory.getCategory(info.mUUID); -			// Category has been deleted, remove from queue. -			if (!cat) +			if (info.mIsCategory)  			{ -				mFetchQueue.pop_front(); -				continue; -			} + +				LLViewerInventoryCategory* cat = gInventory.getCategory(info.mUUID); + +				// Category has been deleted, remove from queue. +				if (!cat) +				{ +					mFetchQueue.pop_front(); +					continue; +				} -			if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches &&  -				LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) -			{ -				// Category exists but has no children yet, fetch the descendants -				// for now, just request every time and rely on retry timer to throttle. -				if (cat->fetch()) +				if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches &&  +					LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())  				{ -					mFetchTimer.reset(); -					mTimelyFetchPending = TRUE; +					// Category exists but has no children yet, fetch the descendants +					// for now, just request every time and rely on retry timer to throttle. +					if (cat->fetch()) +					{ +						mFetchTimer.reset(); +						mTimelyFetchPending = TRUE; +					} +					else +					{ +						//  The catagory also tracks if it has expired and here it says it hasn't +						//  yet.  Get out of here because nothing is going to happen until we +						//  update the timers. +						break; +					}  				} -				else +				// Do I have all my children? +				else if (gInventory.isCategoryComplete(info.mUUID))  				{ -					//  The catagory also tracks if it has expired and here it says it hasn't -					//  yet.  Get out of here because nothing is going to happen until we -					//  update the timers. +					// Finished with this category, remove from queue. +					mFetchQueue.pop_front(); + +					// Add all children to queue. +					LLInventoryModel::cat_array_t* categories; +					LLInventoryModel::item_array_t* items; +					gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items); +					for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); +						 it != categories->end(); +						 ++it) +					{ +						mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(),info.mRecursive)); +					} + +					// We received a response in less than the fast time. +					if (mTimelyFetchPending && mFetchTimer.getElapsedTimeF32() < fast_fetch_time) +					{ +						// Shrink timeouts based on success. +						mMinTimeBetweenFetches = llmax(mMinTimeBetweenFetches * 0.8f, 0.3f); +						mMaxTimeBetweenFetches = llmax(mMaxTimeBetweenFetches * 0.8f, 10.f); +						lldebugs << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; +					} + +					mTimelyFetchPending = FALSE; +					continue; +				} +				else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches) +				{ +					// Received first packet, but our num descendants does not match db's num descendants +					// so try again later. +					mFetchQueue.pop_front(); + +					if (mNumFetchRetries++ < MAX_FETCH_RETRIES) +					{ +						// push on back of queue +						mFetchQueue.push_back(info); +					} +					mTimelyFetchPending = FALSE; +					mFetchTimer.reset();  					break;  				} + +				// Not enough time has elapsed to do a new fetch +				break;  			} -			// Do I have all my children? -			else if (gInventory.isCategoryComplete(info.mUUID)) +			else  			{ -				// Finished with this category, remove from queue. -				mFetchQueue.pop_front(); +				LLViewerInventoryItem* itemp = gInventory.getItem(info.mUUID); -				// Add all children to queue. -				LLInventoryModel::cat_array_t* categories; -				LLInventoryModel::item_array_t* items; -				gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items); -				for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); -					 it != categories->end(); -					 ++it) +				mFetchQueue.pop_front(); +				if (!itemp)   				{ -					mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(),info.mRecursive)); +					continue;  				} -				// We received a response in less than the fast time. -				if (mTimelyFetchPending && mFetchTimer.getElapsedTimeF32() < fast_fetch_time) +				if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches)  				{ -					// Shrink timeouts based on success. -					mMinTimeBetweenFetches = llmax(mMinTimeBetweenFetches * 0.8f, 0.3f); -					mMaxTimeBetweenFetches = llmax(mMaxTimeBetweenFetches * 0.8f, 10.f); -					lldebugs << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; +					itemp->fetchFromServer(); +					mFetchTimer.reset(); +					mTimelyFetchPending = TRUE;  				} - -				mTimelyFetchPending = FALSE; -				continue; -			} -			else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches) -			{ -				// Received first packet, but our num descendants does not match db's num descendants -				// so try again later. -				mFetchQueue.pop_front(); - -				if (mNumFetchRetries++ < MAX_FETCH_RETRIES) +				else if (itemp->mIsComplete) +				{ +					mTimelyFetchPending = FALSE; +				} +				else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches)  				{ -					// push on back of queue  					mFetchQueue.push_back(info); +					mFetchTimer.reset(); +					mTimelyFetchPending = FALSE;  				} -				mTimelyFetchPending = FALSE; -				mFetchTimer.reset(); +				// Not enough time has elapsed to do a new fetch  				break;  			} - -			// Not enough time has elapsed to do a new fetch -			break;  		}  		// @@ -543,7 +572,6 @@ void LLInventoryModelBackgroundFetch::bulkFetch()  	//Background fetch is called from gIdleCallbacks in a loop until background fetch is stopped.  	//If there are items in mFetchQueue, we want to check the time since the last bulkFetch was   	//sent.  If it exceeds our retry time, go ahead and fire off another batch.   -	//Stopbackgroundfetch will be run from the Responder instead of here.    	LLViewerRegion* region = gAgent.getRegion();  	if (!region) return; @@ -574,12 +602,12 @@ void LLInventoryModelBackgroundFetch::bulkFetch()  	LLSD item_request_body;  	LLSD item_request_body_lib; -	while (!(mFetchQueue.empty()) && ((item_count + folder_count) < max_batch_size)) +	while (!mFetchQueue.empty()  +			&& (item_count + folder_count) < max_batch_size)  	{  		const FetchQueueInfo& fetch_info = mFetchQueue.front();  		if (fetch_info.mIsCategory)  		{ -  			const LLUUID &cat_id = fetch_info.mUUID;  			if (cat_id.isNull()) //DEV-17797  			{ diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h index 0745407a8c..9dfedddd6d 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.h +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -48,7 +48,7 @@ public:  	// This gets triggered when performing a filter-search.  	void start(const LLUUID& cat_id = LLUUID::null, BOOL recursive = TRUE); -	BOOL backgroundFetchActive() const; +	BOOL folderFetchActive() const;  	bool isEverythingFetched() const; // completing the fetch once per session should be sufficient  	bool libraryFetchStarted() const; @@ -67,7 +67,6 @@ protected:  	void backgroundFetch();  	static void backgroundFetchCB(void*); // background fetch idle function -	void stopBackgroundFetch(); // stop fetch process  	void setAllFoldersFetched();  	bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) const; @@ -77,6 +76,7 @@ private:  	BOOL mAllFoldersFetched;  	BOOL mBackgroundFetchActive; +	bool mFolderFetchActive;  	S16 mFetchCount;  	BOOL mTimelyFetchPending;  	S32 mNumFetchRetries; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 382569fa3a..01a8ecfb5d 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -817,7 +817,7 @@ BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)  	if(handled)  	{  		ECursorType cursor = getWindow()->getCursor(); -		if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && cursor == UI_CURSOR_ARROW) +		if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() && cursor == UI_CURSOR_ARROW)  		{  			// replace arrow cursor with arrow and hourglass cursor  			getWindow()->setCursor(UI_CURSOR_WORKING); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 374afb90be..c3c62920d3 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -567,7 +567,7 @@ void LLPanelMainInventory::updateItemcountText()  	std::string text = ""; -	if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive()) +	if (LLInventoryModelBackgroundFetch::instance().folderFetchActive())  	{  		text = getString("ItemcountFetching", string_args);  	} diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index cf52b5165b..45ca23cdfe 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -436,11 +436,6 @@ void LLViewerInventoryItem::fetchFromServer(void) const  			gAgent.sendReliableMessage();  		}  	} -	else -	{ -		// *FIX: this can be removed after a bit. -		llwarns << "request to fetch complete item" << llendl; -	}  }  // virtual  | 
