diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2021-04-23 00:22:31 +0300 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2021-04-23 17:48:48 +0300 | 
| commit | be7f6b857547e008500b56a9838b5df72b0b49cd (patch) | |
| tree | a20e4bf4ce8f70345a6156f5dc8b6e89da03c5b0 | |
| parent | 1b900651f193c3750b51b9e945797e1f6d3c63f5 (diff) | |
SL-14956 Fix landmarks sometimes staying in mLoadedCallbackMap #2
Improved fix
| -rw-r--r-- | indra/newview/lllandmarklist.cpp | 29 | ||||
| -rw-r--r-- | indra/newview/lllandmarklist.h | 1 | 
2 files changed, 27 insertions, 3 deletions
| diff --git a/indra/newview/lllandmarklist.cpp b/indra/newview/lllandmarklist.cpp index b88ef39a07..88d3f2c5b6 100644 --- a/indra/newview/lllandmarklist.cpp +++ b/indra/newview/lllandmarklist.cpp @@ -162,6 +162,16 @@ void LLLandmarkList::processGetAssetReply(                      gLandmarkList.makeCallbacks(uuid);                  }              } +            else +            { +                // failed to parse, shouldn't happen +                gLandmarkList.eraseCallbacks(uuid); +            } +        } +        else +        { +            // got a good status, but no file, shouldn't happen +            gLandmarkList.eraseCallbacks(uuid);          }  	}  	else @@ -180,7 +190,7 @@ void LLLandmarkList::processGetAssetReply(  		gLandmarkList.mBadList.insert(uuid);          gLandmarkList.mRequestedList.erase(uuid); //mBadList effectively blocks any load, so no point keeping id in requests -        // todo: this should clean mLoadedCallbackMap! +        gLandmarkList.eraseCallbacks(uuid);  	}      // getAssetData can fire callback immediately, causing @@ -220,19 +230,32 @@ BOOL LLLandmarkList::assetExists(const LLUUID& asset_uuid)  void LLLandmarkList::onRegionHandle(const LLUUID& landmark_id)  {  	LLLandmark* landmark = getAsset(landmark_id); +    if (!landmark) +    { +        LL_WARNS() << "Got region handle but the landmark " << landmark_id << " not found." << LL_ENDL; +        eraseCallbacks(landmark_id); +        return; +    }  	// Calculate landmark global position.  	// This should succeed since the region handle is available.  	LLVector3d pos; -	if (landmark && !landmark->getGlobalPos(pos)) +	if (!landmark->getGlobalPos(pos))  	{ -		LL_WARNS() << "Got region handle but the landmark " << landmark_id << " global position is still unknown." << LL_ENDL; +        LL_WARNS() << "Got region handle but the landmark " << landmark_id << " global position is still unknown." << LL_ENDL; +        eraseCallbacks(landmark_id); +        return;  	}      // Call this even if no landmark exists to clean mLoadedCallbackMap  	makeCallbacks(landmark_id);  } +void LLLandmarkList::eraseCallbacks(const LLUUID& landmark_id) +{ +    mLoadedCallbackMap.erase(landmark_id); +} +  void LLLandmarkList::makeCallbacks(const LLUUID& landmark_id)  {  	LLLandmark* landmark = getAsset(landmark_id); diff --git a/indra/newview/lllandmarklist.h b/indra/newview/lllandmarklist.h index 2e7bd25610..4f3b11660d 100644 --- a/indra/newview/lllandmarklist.h +++ b/indra/newview/lllandmarklist.h @@ -65,6 +65,7 @@ public:  protected:  	void onRegionHandle(const LLUUID& landmark_id); +	void eraseCallbacks(const LLUUID& landmark_id);  	void makeCallbacks(const LLUUID& landmark_id);  	typedef std::map<LLUUID, LLLandmark*> landmark_list_t; | 
