void LLAvatarNameCache::idle() { // By convention, start running at first idle() call sRunning = true; // *TODO: Possibly re-enabled this based on People API load measurements // 100 ms is the threshold for "user speed" operations, so we can // stall for about that long to batch up requests. //const F32 SECS_BETWEEN_REQUESTS = 0.1f; //if (!sRequestTimer.checkExpirationAndReset(SECS_BETWEEN_REQUESTS)) //{ // return; //} if (!sAskQueue.empty()) { if (useDisplayNames()) { requestNamesViaCapability(); } else { // ...fall back to legacy name cache system requestNamesViaLegacy(); } } // erase anything that has not been refreshed for more than MAX_UNREFRESHED_TIME eraseUnrefreshed(); }
void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) { if (sRunning) { // ...only do immediate lookups when cache is running if (useDisplayNames()) { // ...use new cache std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id); if (it != sCache.end()) { const LLAvatarName& av_name = it->second; if (av_name.mExpires > LLFrameTimer::getTotalSeconds()) { // ...name already exists in cache, fire callback now fireSignal(agent_id, slot, av_name); return; } } } else { // ...use old name system std::string full_name; if (gCacheName->getFullName(agent_id, full_name)) { LLAvatarName av_name; buildLegacyName(full_name, &av_name); fireSignal(agent_id, slot, av_name); return; } } } // schedule a request if (!isRequestPending(agent_id)) { sAskQueue.insert(agent_id); } // always store additional callback, even if request is pending signal_map_t::iterator sig_it = sSignalMap.find(agent_id); if (sig_it == sSignalMap.end()) { // ...new callback for this id callback_signal_t* signal = new callback_signal_t(); signal->connect(slot); sSignalMap[agent_id] = signal; } else { // ...existing callback, bind additional slot callback_signal_t* signal = sig_it->second; signal->connect(slot); } }
// fills in av_name if it has it in the cache, even if expired (can check expiry time) // returns bool specifying if av_name was filled, false otherwise bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) { if (sRunning) { // ...only do immediate lookups when cache is running if (useDisplayNames()) { // ...use display names cache std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id); if (it != sCache.end()) { *av_name = it->second; if(LGGContactSets::getInstance()->hasPseudonym(agent_id)) { LLSD info = av_name->asLLSD(); info["is_display_name_default"]=LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id); info["display_name"]=LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id)?(info["legacy_first_name"].asString()+" "+info["legacy_last_name"].asString()):LGGContactSets::getInstance()->getPseudonym(agent_id); av_name->fromLLSD(info); } // re-request name if entry is expired if (av_name->mExpires < LLFrameTimer::getTotalSeconds()) { if (!isRequestPending(agent_id)) { LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get " << "refresh agent " << agent_id << LL_ENDL; sAskQueue.insert(agent_id); } } return true; } } else { // ...use legacy names cache std::string full_name; if (gCacheName->getFullName(agent_id, full_name)) { buildLegacyName(full_name, av_name); return true; } } } if (!isRequestPending(agent_id)) { LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get " << "queue request for agent " << agent_id << LL_ENDL; sAskQueue.insert(agent_id); } return false; }
// fills in av_name if it has it in the cache, even if expired (can check expiry time) // returns bool specifying if av_name was filled, false otherwise bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) { if (sRunning) { // ...only do immediate lookups when cache is running if (useDisplayNames()) { // ...use display names cache std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id); if (it != sCache.end()) { *av_name = it->second; // re-request name if entry is expired if (av_name->mExpires < LLFrameTimer::getTotalSeconds()) { if (!isRequestPending(agent_id)) { LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get " << "refresh agent " << agent_id << LL_ENDL; sAskQueue.insert(agent_id); } } return true; } } else { // ...use legacy names cache std::string full_name; if (gCacheName->getFullName(agent_id, full_name)) { buildLegacyName(full_name, av_name); return true; } } } if (!isRequestPending(agent_id)) { LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get " << "queue request for agent " << agent_id << LL_ENDL; sAskQueue.insert(agent_id); } return false; }
void LLAvatarNameCache::idle() { // By convention, start running at first idle() call sRunning = true; // *TODO: Possibly re-enabled this based on People API load measurements // 100 ms is the threshold for "user speed" operations, so we can // stall for about that long to batch up requests. //const F32 SECS_BETWEEN_REQUESTS = 0.1f; //if (!sRequestTimer.checkExpirationAndReset(SECS_BETWEEN_REQUESTS)) //{ // return; //} // Must be large relative to above // No longer deleting expired entries, just re-requesting in the get // this way first synchronous get call on an expired entry won't return // legacy name. LF //const F32 ERASE_EXPIRED_TIMEOUT = 60.f; // seconds //if (sEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT)) //{ // eraseExpired(); //} if (sAskQueue.empty()) { return; } if (useDisplayNames()) { requestNamesViaCapability(); } else { // ...fall back to legacy name cache system requestNamesViaLegacy(); } }
LLAvatarNameCache::callback_connection_t LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) { callback_connection_t connection; if (sRunning) { // ...only do immediate lookups when cache is running if (useDisplayNames()) { LL_DEBUGS("AvNameCache") << "DN cache lookup for " << agent_id << llendl; // ...use new cache std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id); if (it != sCache.end()) { LLAvatarName& av_name = it->second; LLSD test = av_name.asLLSD(); LL_DEBUGS("AvNameCache") << "DN cache hit for :" << test["display_name"].asString()+" (" + test["legacy_first_name"].asString()+" "+test["legacy_last_name"].asString()+")" << llendl; if(LGGContactSets::getInstance()->hasPseudonym(agent_id)) { LL_DEBUGS("AvNameCache") << "DN cache hit via alias" << llendl; LLSD info = av_name.asLLSD(); info["is_display_name_default"]=LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id); info["display_name"]=LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id)?(info["legacy_first_name"].asString()+" "+info["legacy_last_name"].asString()):LGGContactSets::getInstance()->getPseudonym(agent_id); av_name.fromLLSD(info); } if (av_name.mExpires > LLFrameTimer::getTotalSeconds()) { // ...name already exists in cache, fire callback now LL_DEBUGS("AvNameCache") << "DN cache hit valid" << llendl; fireSignal(agent_id, slot, av_name); return connection; } // If we get here, our DN is expired. //Consider it a cache miss, handle as if sRunning was false. LL_DEBUGS("AvNameCache") << "DN cache hit expired. " << av_name.mExpires << " vs. " << LLFrameTimer::getTotalSeconds() << llendl; } //If we get here, cache miss. We'll schedule it below } else { // ...use old name system std::string full_name; if (gCacheName->getFullName(agent_id, full_name)) { LLAvatarName av_name; buildLegacyName(full_name, &av_name); fireSignal(agent_id, slot, av_name); return connection; } } } // schedule a request if (!isRequestPending(agent_id)) { LL_DEBUGS("AvNameCache") << "DN scheduling lookup for" << agent_id << llendl; sAskQueue.insert(agent_id); } else { LL_DEBUGS("AvNameCache") << "DN lookup for " << agent_id << " already in progress. Returning." << llendl; } // always store additional callback, even if request is pending signal_map_t::iterator sig_it = sSignalMap.find(agent_id); if (sig_it == sSignalMap.end()) { // ...new callback for this id callback_signal_t* signal = new callback_signal_t(); connection = signal->connect(slot); sSignalMap[agent_id] = signal; } else { // ...existing callback, bind additional slot callback_signal_t* signal = sig_it->second; connection = signal->connect(slot); } return connection; }