SH-4634 FIX Interesting: Viewer crashes when receiving teleport offer
renamed fast timers to have unique names, changes instance tracker to never allow duplicatesmaster
parent
a868b7ed41
commit
391ac367d6
|
|
@ -64,8 +64,8 @@ LL_COMMON_API void assert_main_thread();
|
|||
|
||||
enum EInstanceTrackerAllowKeyCollisions
|
||||
{
|
||||
LLInstanceTrackerAllowKeyCollisions,
|
||||
LLInstanceTrackerDisallowKeyCollisions
|
||||
LLInstanceTrackerErrorOnCollision,
|
||||
LLInstanceTrackerReplaceOnCollision
|
||||
};
|
||||
|
||||
/// This mix-in class adds support for tracking all instances of the specified class parameter T
|
||||
|
|
@ -73,7 +73,7 @@ enum EInstanceTrackerAllowKeyCollisions
|
|||
/// If KEY is not provided, then instances are stored in a simple set
|
||||
/// @NOTE: see explicit specialization below for default KEY==void case
|
||||
/// @NOTE: this class is not thread-safe unless used as read-only
|
||||
template<typename T, typename KEY = void, EInstanceTrackerAllowKeyCollisions ALLOW_KEY_COLLISIONS = LLInstanceTrackerDisallowKeyCollisions>
|
||||
template<typename T, typename KEY = void, EInstanceTrackerAllowKeyCollisions KEY_COLLISION_BEHAVIOR = LLInstanceTrackerErrorOnCollision>
|
||||
class LLInstanceTracker : public LLInstanceTrackerBase
|
||||
{
|
||||
typedef LLInstanceTracker<T, KEY> self_t;
|
||||
|
|
@ -192,7 +192,7 @@ public:
|
|||
}
|
||||
|
||||
protected:
|
||||
LLInstanceTracker(KEY key)
|
||||
LLInstanceTracker(const KEY& key)
|
||||
{
|
||||
// make sure static data outlives all instances
|
||||
getStatic();
|
||||
|
|
@ -211,28 +211,44 @@ private:
|
|||
LLInstanceTracker( const LLInstanceTracker& );
|
||||
const LLInstanceTracker& operator=( const LLInstanceTracker& );
|
||||
|
||||
void add_(KEY key)
|
||||
void add_(const KEY& key)
|
||||
{
|
||||
mInstanceKey = key;
|
||||
InstanceMap& map = getMap_();
|
||||
typename InstanceMap::iterator insertion_point_it = map.lower_bound(key);
|
||||
if (ALLOW_KEY_COLLISIONS == LLInstanceTrackerDisallowKeyCollisions
|
||||
&& insertion_point_it != map.end()
|
||||
if (insertion_point_it != map.end()
|
||||
&& insertion_point_it->first == key)
|
||||
{
|
||||
LL_ERRS() << "Key " << key << " already exists in instance map for " << typeid(T).name() << LL_ENDL;
|
||||
{ // found existing entry with that key
|
||||
switch(KEY_COLLISION_BEHAVIOR)
|
||||
{
|
||||
case LLInstanceTrackerErrorOnCollision:
|
||||
{
|
||||
// use assert here instead of LL_ERRS(), otherwise the error will be ignored since this call is made during global object initialization
|
||||
llassert_always_msg(false, "ERROR: Instance with this same key already exists!");
|
||||
break;
|
||||
}
|
||||
case LLInstanceTrackerReplaceOnCollision:
|
||||
{
|
||||
// replace pointer, but leave key (should have compared equal anyway)
|
||||
insertion_point_it->second = static_cast<T*>(this);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
{ // new key
|
||||
map.insert(insertion_point_it, std::make_pair(key, static_cast<T*>(this)));
|
||||
}
|
||||
}
|
||||
void remove_()
|
||||
{
|
||||
typename InstanceMap::iterator iter = getMap_().find(mInstanceKey);
|
||||
if (iter != getMap_().end())
|
||||
InstanceMap& map = getMap_();
|
||||
typename InstanceMap::iterator iter = map.find(mInstanceKey);
|
||||
if (iter != map.end())
|
||||
{
|
||||
getMap_().erase(iter);
|
||||
map.erase(iter);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -242,8 +258,8 @@ private:
|
|||
|
||||
/// explicit specialization for default case where KEY is void
|
||||
/// use a simple std::set<T*>
|
||||
template<typename T, EInstanceTrackerAllowKeyCollisions ALLOW_KEY_COLLISIONS>
|
||||
class LLInstanceTracker<T, void, ALLOW_KEY_COLLISIONS> : public LLInstanceTrackerBase
|
||||
template<typename T, EInstanceTrackerAllowKeyCollisions KEY_COLLISION_BEHAVIOR>
|
||||
class LLInstanceTracker<T, void, KEY_COLLISION_BEHAVIOR> : public LLInstanceTrackerBase
|
||||
{
|
||||
typedef LLInstanceTracker<T, void> self_t;
|
||||
typedef typename std::set<T*> InstanceSet;
|
||||
|
|
|
|||
|
|
@ -69,10 +69,10 @@ protected:
|
|||
template<typename ACCUMULATOR>
|
||||
class StatType
|
||||
: public StatBase,
|
||||
public LLInstanceTracker<StatType<ACCUMULATOR>, std::string, LLInstanceTrackerAllowKeyCollisions>
|
||||
public LLInstanceTracker<StatType<ACCUMULATOR>, std::string>
|
||||
{
|
||||
public:
|
||||
typedef LLInstanceTracker<StatType<ACCUMULATOR>, std::string, LLInstanceTrackerAllowKeyCollisions> instance_tracker_t;
|
||||
typedef LLInstanceTracker<StatType<ACCUMULATOR>, std::string> instance_tracker_t;
|
||||
StatType(const char* name, const char* description)
|
||||
: instance_tracker_t(name),
|
||||
StatBase(name, description),
|
||||
|
|
|
|||
|
|
@ -471,13 +471,13 @@ namespace LLTrace
|
|||
//
|
||||
// members
|
||||
//
|
||||
U64 mTotalTimeCounter,
|
||||
mSelfTimeCounter;
|
||||
S32 mCalls;
|
||||
U64 mTotalTimeCounter,
|
||||
mSelfTimeCounter;
|
||||
S32 mCalls;
|
||||
class BlockTimerStatHandle* mParent; // last acknowledged parent of this time block
|
||||
class BlockTimerStatHandle* mLastCaller; // used to bootstrap tree construction
|
||||
U16 mActiveCount; // number of timers with this ID active on stack
|
||||
bool mMoveUpTree; // needs to be moved up the tree of timers at the end of frame
|
||||
U16 mActiveCount; // number of timers with this ID active on stack
|
||||
bool mMoveUpTree; // needs to be moved up the tree of timers at the end of frame
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -553,10 +553,10 @@ void LLStatBar::draw()
|
|||
void LLStatBar::setStat(const std::string& stat_name)
|
||||
{
|
||||
using namespace LLTrace;
|
||||
const StatType<CountAccumulator>* count_stat;
|
||||
const StatType<EventAccumulator>* event_stat;
|
||||
const StatType<SampleAccumulator>* sample_stat;
|
||||
const StatType<MemAccumulator>* mem_stat;
|
||||
const StatType<CountAccumulator>* count_stat;
|
||||
const StatType<EventAccumulator>* event_stat;
|
||||
const StatType<SampleAccumulator>* sample_stat;
|
||||
const StatType<MemAccumulator>* mem_stat;
|
||||
|
||||
if ((count_stat = StatType<CountAccumulator>::getInstance(stat_name)))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1262,6 +1262,7 @@ static LLTrace::BlockTimerStatHandle FTM_SERVICE_CALLBACK("Callback");
|
|||
static LLTrace::BlockTimerStatHandle FTM_AGENT_AUTOPILOT("Autopilot");
|
||||
static LLTrace::BlockTimerStatHandle FTM_AGENT_UPDATE("Update");
|
||||
|
||||
// externally visible timers
|
||||
LLTrace::BlockTimerStatHandle FTM_FRAME("Frame");
|
||||
|
||||
bool LLAppViewer::mainLoop()
|
||||
|
|
|
|||
|
|
@ -127,10 +127,11 @@ void LLConversationViewSession::setHighlightState(bool hihglight_state)
|
|||
|
||||
void LLConversationViewSession::startFlashing()
|
||||
{
|
||||
LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
|
||||
|
||||
// Need to start flashing only when "Conversations" is opened or brought on top
|
||||
if (isInVisibleChain() && !im_box->isMinimized() && mFlashStateOn && !mFlashStarted)
|
||||
if (isInVisibleChain()
|
||||
&& mFlashStateOn
|
||||
&& !mFlashStarted
|
||||
&& ! LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->isMinimized() )
|
||||
{
|
||||
mFlashStarted = true;
|
||||
mFlashTimer->startFlashing();
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ static LLChatTypeTrigger sChatTypeTriggers[] = {
|
|||
|
||||
|
||||
LLFloaterIMNearbyChat::LLFloaterIMNearbyChat(const LLSD& llsd)
|
||||
: LLFloaterIMSessionTab(llsd),
|
||||
: LLFloaterIMSessionTab(LLSD(LLUUID::null)),
|
||||
//mOutputMonitor(NULL),
|
||||
mSpeakerMgr(NULL),
|
||||
mExpandedHeight(COLLAPSED_HEIGHT + EXPANDED_HEIGHT)
|
||||
|
|
@ -97,7 +97,6 @@ LLFloaterIMNearbyChat::LLFloaterIMNearbyChat(const LLSD& llsd)
|
|||
mIsP2PChat = false;
|
||||
mIsNearbyChat = true;
|
||||
mSpeakerMgr = LLLocalSpeakerMgr::getInstance();
|
||||
mSessionID = LLUUID();
|
||||
}
|
||||
|
||||
//static
|
||||
|
|
|
|||
|
|
@ -47,24 +47,24 @@
|
|||
const F32 REFRESH_INTERVAL = 1.0f;
|
||||
|
||||
LLFloaterIMSessionTab::LLFloaterIMSessionTab(const LLSD& session_id)
|
||||
: LLTransientDockableFloater(NULL, true, session_id)
|
||||
, mIsP2PChat(false)
|
||||
, mExpandCollapseBtn(NULL)
|
||||
, mTearOffBtn(NULL)
|
||||
, mCloseBtn(NULL)
|
||||
, mSessionID(session_id.asUUID())
|
||||
, mConversationsRoot(NULL)
|
||||
, mScroller(NULL)
|
||||
, mChatHistory(NULL)
|
||||
, mInputEditor(NULL)
|
||||
, mInputEditorPad(0)
|
||||
, mRefreshTimer(new LLTimer())
|
||||
, mIsHostAttached(false)
|
||||
, mHasVisibleBeenInitialized(false)
|
||||
, mIsParticipantListExpanded(true)
|
||||
, mChatLayoutPanel(NULL)
|
||||
, mInputPanels(NULL)
|
||||
, mChatLayoutPanelHeight(0)
|
||||
: LLTransientDockableFloater(NULL, true, session_id),
|
||||
mIsP2PChat(false),
|
||||
mExpandCollapseBtn(NULL),
|
||||
mTearOffBtn(NULL),
|
||||
mCloseBtn(NULL),
|
||||
mSessionID(session_id.asUUID()),
|
||||
mConversationsRoot(NULL),
|
||||
mScroller(NULL),
|
||||
mChatHistory(NULL),
|
||||
mInputEditor(NULL),
|
||||
mInputEditorPad(0),
|
||||
mRefreshTimer(new LLTimer()),
|
||||
mIsHostAttached(false),
|
||||
mHasVisibleBeenInitialized(false),
|
||||
mIsParticipantListExpanded(true),
|
||||
mChatLayoutPanel(NULL),
|
||||
mInputPanels(NULL),
|
||||
mChatLayoutPanelHeight(0)
|
||||
{
|
||||
setAutoFocus(FALSE);
|
||||
mSession = LLIMModel::getInstance()->findIMSession(mSessionID);
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
//
|
||||
// class LLFolderViewModelInventory
|
||||
//
|
||||
static LLTrace::BlockTimerStatHandle FTM_INVENTORY_SORT("Sort");
|
||||
static LLTrace::BlockTimerStatHandle FTM_INVENTORY_SORT("Inventory Sort");
|
||||
|
||||
bool LLFolderViewModelInventory::startDrag(std::vector<LLFolderViewModelItem*>& items)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -54,11 +54,11 @@ LLHUDManager::~LLHUDManager()
|
|||
{
|
||||
}
|
||||
|
||||
static LLTrace::BlockTimerStatHandle FTM_HUD_EFFECTS("Hud Effects");
|
||||
static LLTrace::BlockTimerStatHandle FTM_UPDATE_HUD_EFFECTS("Update Hud Effects");
|
||||
|
||||
void LLHUDManager::updateEffects()
|
||||
{
|
||||
LL_RECORD_BLOCK_TIME(FTM_HUD_EFFECTS);
|
||||
LL_RECORD_BLOCK_TIME(FTM_UPDATE_HUD_EFFECTS);
|
||||
S32 i;
|
||||
for (i = 0; i < mHUDEffects.size(); i++)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -527,7 +527,7 @@ void LLMaterialMgr::onPutResponse(bool success, const LLSD& content)
|
|||
}
|
||||
}
|
||||
|
||||
static LLTrace::BlockTimerStatHandle FTM_MATERIALS_IDLE("Materials");
|
||||
static LLTrace::BlockTimerStatHandle FTM_MATERIALS_IDLE("Idle Materials");
|
||||
|
||||
void LLMaterialMgr::onIdle(void*)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ LLToastNotifyPanel::button_click_signal_t LLToastNotifyPanel::sButtonClickSignal
|
|||
|
||||
LLToastNotifyPanel::LLToastNotifyPanel(const LLNotificationPtr& notification, const LLRect& rect, bool show_images)
|
||||
: LLToastPanel(notification),
|
||||
LLInstanceTracker<LLToastNotifyPanel, LLUUID, LLInstanceTrackerAllowKeyCollisions>(notification->getID())
|
||||
LLInstanceTracker<LLToastNotifyPanel, LLUUID, LLInstanceTrackerReplaceOnCollision>(notification->getID())
|
||||
{
|
||||
init(rect, show_images);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ class LLNotificationForm;
|
|||
* @deprecated this class will be removed after all toast panel types are
|
||||
* implemented in separate classes.
|
||||
*/
|
||||
class LLToastNotifyPanel: public LLToastPanel, public LLInstanceTracker<LLToastNotifyPanel, LLUUID, LLInstanceTrackerAllowKeyCollisions>
|
||||
class LLToastNotifyPanel: public LLToastPanel, public LLInstanceTracker<LLToastNotifyPanel, LLUUID, LLInstanceTrackerReplaceOnCollision>
|
||||
{
|
||||
public:
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -231,7 +231,7 @@ void display_stats()
|
|||
static LLTrace::BlockTimerStatHandle FTM_PICK("Picking");
|
||||
static LLTrace::BlockTimerStatHandle FTM_RENDER("Render");
|
||||
static LLTrace::BlockTimerStatHandle FTM_UPDATE_SKY("Update Sky");
|
||||
static LLTrace::BlockTimerStatHandle FTM_UPDATE_TEXTURES("Update Textures");
|
||||
static LLTrace::BlockTimerStatHandle FTM_UPDATE_DYNAMIC_TEXTURES("Update Dynamic Textures");
|
||||
static LLTrace::BlockTimerStatHandle FTM_IMAGE_UPDATE("Update Images");
|
||||
static LLTrace::BlockTimerStatHandle FTM_IMAGE_UPDATE_CLASS("Class");
|
||||
static LLTrace::BlockTimerStatHandle FTM_IMAGE_UPDATE_BUMP("Image Update Bump");
|
||||
|
|
@ -590,7 +590,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
|||
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_DYNAMIC_TEXTURES))
|
||||
{
|
||||
LLAppViewer::instance()->pingMainloopTimeout("Display:DynamicTextures");
|
||||
LL_RECORD_BLOCK_TIME(FTM_UPDATE_TEXTURES);
|
||||
LL_RECORD_BLOCK_TIME(FTM_UPDATE_DYNAMIC_TEXTURES);
|
||||
if (LLViewerDynamicTexture::updateAllInstances())
|
||||
{
|
||||
gGL.setColorMask(true, true);
|
||||
|
|
|
|||
|
|
@ -779,8 +779,8 @@ static bool proximity_comparitor(const LLViewerMediaImpl* i1, const LLViewerMedi
|
|||
static LLTrace::BlockTimerStatHandle FTM_MEDIA_UPDATE("Update Media");
|
||||
static LLTrace::BlockTimerStatHandle FTM_MEDIA_SPARE_IDLE("Spare Idle");
|
||||
static LLTrace::BlockTimerStatHandle FTM_MEDIA_UPDATE_INTEREST("Update/Interest");
|
||||
static LLTrace::BlockTimerStatHandle FTM_MEDIA_SORT("Sort");
|
||||
static LLTrace::BlockTimerStatHandle FTM_MEDIA_SORT2("Sort 2");
|
||||
static LLTrace::BlockTimerStatHandle FTM_MEDIA_SORT("Media Sort");
|
||||
static LLTrace::BlockTimerStatHandle FTM_MEDIA_SORT2("Media Sort 2");
|
||||
static LLTrace::BlockTimerStatHandle FTM_MEDIA_MISC("Misc");
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -670,11 +670,11 @@ static LLTrace::BlockTimerStatHandle FTM_IMAGE_FETCH("Fetch");
|
|||
static LLTrace::BlockTimerStatHandle FTM_FAST_CACHE_IMAGE_FETCH("Fast Cache Fetch");
|
||||
static LLTrace::BlockTimerStatHandle FTM_IMAGE_CREATE("Create");
|
||||
static LLTrace::BlockTimerStatHandle FTM_IMAGE_STATS("Stats");
|
||||
static LLTrace::BlockTimerStatHandle FTM_UPDATE_IMAGES("Update Images");
|
||||
static LLTrace::BlockTimerStatHandle FTM_UPDATE_TEXTURES("Update Textures");
|
||||
|
||||
void LLViewerTextureList::updateImages(F32 max_time)
|
||||
{
|
||||
LL_RECORD_BLOCK_TIME(FTM_UPDATE_IMAGES);
|
||||
LL_RECORD_BLOCK_TIME(FTM_UPDATE_TEXTURES);
|
||||
static BOOL cleared = FALSE;
|
||||
if(gTeleportDisplay)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -242,7 +242,7 @@ LLTrace::BlockTimerStatHandle FTM_RENDER_WL_SKY("Windlight Sky");
|
|||
LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA("Alpha Objects");
|
||||
LLTrace::BlockTimerStatHandle FTM_RENDER_CHARACTERS("Avatars");
|
||||
LLTrace::BlockTimerStatHandle FTM_RENDER_BUMP("Bump");
|
||||
LLTrace::BlockTimerStatHandle FTM_RENDER_MATERIALS("Materials");
|
||||
LLTrace::BlockTimerStatHandle FTM_RENDER_MATERIALS("Render Materials");
|
||||
LLTrace::BlockTimerStatHandle FTM_RENDER_FULLBRIGHT("Fullbright");
|
||||
LLTrace::BlockTimerStatHandle FTM_RENDER_GLOW("Glow");
|
||||
LLTrace::BlockTimerStatHandle FTM_GEO_UPDATE("Geo Update");
|
||||
|
|
|
|||
Loading…
Reference in New Issue