Merged in SL-13783 and SL-13789

master
Andrey Kleshchev 2020-08-17 20:49:56 +00:00
commit fa0cc7b6d2
4 changed files with 42 additions and 3 deletions

View File

@ -140,6 +140,12 @@ LLCoprocedureManager::~LLCoprocedureManager()
close();
}
void LLCoprocedureManager::initSingleton()
{
// workaround until we get mutex into initializePool
initializePool("VAssetStorage");
}
LLCoprocedureManager::poolPtr_t LLCoprocedureManager::initializePool(const std::string &poolName)
{
// Attempt to look up a pool size in the configuration. If found use that

View File

@ -40,6 +40,7 @@ class LLCoprocedureManager : public LLSingleton < LLCoprocedureManager >
{
LLSINGLETON(LLCoprocedureManager);
virtual ~LLCoprocedureManager();
/*virtual*/ void initSingleton();
public:
typedef boost::function<U32(const std::string &)> SettingQuery_t;

View File

@ -39,6 +39,11 @@
// Globals
LLLandmarkList gLandmarkList;
// number is mostly arbitrary, but it should be below DEFAULT_QUEUE_SIZE pool size,
// which is 4096, to not overfill the pool if user has more than 4K of landmarks,
// and low number helps with not flooding server with requests
const S32 MAX_SIMULTANEOUS_REQUESTS = 512;
////////////////////////////////////////////////////////////////////////////
// LLLandmarkList
@ -69,6 +74,11 @@ LLLandmark* LLLandmarkList::getAsset(const LLUUID& asset_uuid, loaded_callback_t
{
return NULL;
}
if ( mWaitList.find(asset_uuid) != mWaitList.end() )
{
// Landmark is sheduled for download, but not requested yet
return NULL;
}
landmark_requested_list_t::iterator iter = mRequestedList.find(asset_uuid);
if (iter != mRequestedList.end())
@ -86,6 +96,13 @@ LLLandmark* LLLandmarkList::getAsset(const LLUUID& asset_uuid, loaded_callback_t
mLoadedCallbackMap.insert(vt);
}
if (mRequestedList.size() > MAX_SIMULTANEOUS_REQUESTS)
{
// Postpone download till queu is emptier
mWaitList.insert(asset_uuid);
return NULL;
}
gAssetStorage->getAssetData(asset_uuid,
LLAssetType::AT_LANDMARK,
LLLandmarkList::processGetAssetReply,
@ -155,8 +172,22 @@ 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!
}
if (!gLandmarkList.mWaitList.empty())
{
// start new download from wait list
landmark_uuid_list_t::iterator iter = gLandmarkList.mWaitList.begin();
LLUUID asset_uuid = *iter;
gLandmarkList.mWaitList.erase(iter);
gAssetStorage->getAssetData(asset_uuid,
LLAssetType::AT_LANDMARK,
LLLandmarkList::processGetAssetReply,
NULL);
gLandmarkList.mRequestedList[asset_uuid] = gFrameTimeSeconds;
}
}
BOOL LLLandmarkList::isAssetInLoadedCallbackMap(const LLUUID& asset_uuid)

View File

@ -70,9 +70,10 @@ protected:
typedef std::map<LLUUID, LLLandmark*> landmark_list_t;
landmark_list_t mList;
typedef std::set<LLUUID> landmark_bad_list_t;
landmark_bad_list_t mBadList;
typedef std::set<LLUUID> landmark_uuid_list_t;
landmark_uuid_list_t mBadList;
landmark_uuid_list_t mWaitList;
typedef std::map<LLUUID,F32> landmark_requested_list_t;
landmark_requested_list_t mRequestedList;