From 18bd525d00ee3ce16164900293ee6ea8c2204589 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Wed, 11 Jul 2012 08:14:34 -0400
Subject: MAINT-1175: Forbid LLRegistry[Singleton]<std::type_info*, ...>. Back
 out code that selects LLTypeInfoLookup for the underlying map implementation
 when KEY = [const] std::type_info*, because LLTypeInfoLookup's API is
 changing to become incompatible with std::map. Instead, fail with
 STATIC_ASSERT when LLRegistry's KEY is [const] std::type_info*. Fix all
 existing uses to use std::type_info::name() string instead.

---
 indra/newview/llavatarlistitem.cpp    | 2 +-
 indra/newview/llinventorylistitem.cpp | 2 +-
 indra/newview/llwearableitemslist.cpp | 8 ++++----
 3 files changed, 6 insertions(+), 6 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 30eecfe323..c07fec8e5e 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -44,7 +44,7 @@ S32 LLAvatarListItem::sLeftPadding = 0;
 S32 LLAvatarListItem::sNameRightPadding = 0;
 S32 LLAvatarListItem::sChildrenWidths[LLAvatarListItem::ALIC_COUNT];
 
-static LLWidgetNameRegistry::StaticRegistrar sRegisterAvatarListItemParams(&typeid(LLAvatarListItem::Params), "avatar_list_item");
+static LLWidgetNameRegistry::StaticRegistrar sRegisterAvatarListItemParams(typeid(LLAvatarListItem::Params).name(), "avatar_list_item");
 
 LLAvatarListItem::Params::Params()
 :	default_style("default_style"),
diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp
index 3e0849a795..5489671430 100644
--- a/indra/newview/llinventorylistitem.cpp
+++ b/indra/newview/llinventorylistitem.cpp
@@ -40,7 +40,7 @@
 #include "llinventorymodel.h"
 #include "llviewerinventory.h"
 
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelInventoryListItemBaseParams(&typeid(LLPanelInventoryListItemBase::Params), "inventory_list_item");
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelInventoryListItemBaseParams(typeid(LLPanelInventoryListItemBase::Params).name(), "inventory_list_item");
 
 static const S32 WIDGET_SPACING = 3;
 
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index 92697fb2eb..abb53301a6 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -135,7 +135,7 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name,
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelClothingListItem(&typeid(LLPanelClothingListItem::Params), "clothing_list_item");
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelClothingListItem(typeid(LLPanelClothingListItem::Params).name(), "clothing_list_item");
 
 
 LLPanelClothingListItem::Params::Params()
@@ -222,7 +222,7 @@ BOOL LLPanelClothingListItem::postBuild()
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelBodyPartsListItem(&typeid(LLPanelBodyPartsListItem::Params), "bodyparts_list_item");
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelBodyPartsListItem(typeid(LLPanelBodyPartsListItem::Params).name(), "bodyparts_list_item");
 
 
 LLPanelBodyPartsListItem::Params::Params()
@@ -293,7 +293,7 @@ BOOL LLPanelBodyPartsListItem::postBuild()
 	return TRUE;
 }
 
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDeletableWearableListItem(&typeid(LLPanelDeletableWearableListItem::Params), "deletable_wearable_list_item");
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDeletableWearableListItem(typeid(LLPanelDeletableWearableListItem::Params).name(), "deletable_wearable_list_item");
 
 LLPanelDeletableWearableListItem::Params::Params()
 :	delete_btn("delete_btn")
@@ -373,7 +373,7 @@ void LLPanelAttachmentListItem::updateItem(const std::string& name,
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDummyClothingListItem(&typeid(LLPanelDummyClothingListItem::Params), "dummy_clothing_list_item");
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDummyClothingListItem(typeid(LLPanelDummyClothingListItem::Params).name(), "dummy_clothing_list_item");
 
 LLPanelDummyClothingListItem::Params::Params()
 :	add_panel("add_panel"),
-- 
cgit v1.2.3


From 7f609b6a6958f519bb1becb604132b583ada3fad Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Wed, 18 Jul 2012 15:51:34 -0400
Subject: Backed out changeset a25bfa87418d (using std::type_info::name()) The
 changeset above touched every consumer of the two LLRegistrySingletons
 originally defined with std::type_info* as keys. Those two
 LLRegistrySingletons were changed to use const char* as keys, then all
 consumers were changed to pass std::type_info::name() instead of the plain
 std::type_info* pointer -- to deal with the observed fact that on Linux, a
 given type might produce different std::type_info* pointers in different load
 modules. Since then, Richard turned up the fascinating fact that at least
 some implementations of gcc's std::type_info::before() method already
 accommodate this peculiarity. It seems worth backing out the (dismayingly
 pervasive) change to see if properly using std::type_info::before() as the
 map comparator will work just as well, with conceptually simpler source code.
 This backout is transitional: we don't expect things to build/run properly
 until we've cherry-picked certain other pertinent changes.

---
 indra/newview/llavatarlistitem.cpp    | 2 +-
 indra/newview/llinventorylistitem.cpp | 2 +-
 indra/newview/llwearableitemslist.cpp | 8 ++++----
 3 files changed, 6 insertions(+), 6 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index c07fec8e5e..30eecfe323 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -44,7 +44,7 @@ S32 LLAvatarListItem::sLeftPadding = 0;
 S32 LLAvatarListItem::sNameRightPadding = 0;
 S32 LLAvatarListItem::sChildrenWidths[LLAvatarListItem::ALIC_COUNT];
 
-static LLWidgetNameRegistry::StaticRegistrar sRegisterAvatarListItemParams(typeid(LLAvatarListItem::Params).name(), "avatar_list_item");
+static LLWidgetNameRegistry::StaticRegistrar sRegisterAvatarListItemParams(&typeid(LLAvatarListItem::Params), "avatar_list_item");
 
 LLAvatarListItem::Params::Params()
 :	default_style("default_style"),
diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp
index 5489671430..3e0849a795 100644
--- a/indra/newview/llinventorylistitem.cpp
+++ b/indra/newview/llinventorylistitem.cpp
@@ -40,7 +40,7 @@
 #include "llinventorymodel.h"
 #include "llviewerinventory.h"
 
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelInventoryListItemBaseParams(typeid(LLPanelInventoryListItemBase::Params).name(), "inventory_list_item");
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelInventoryListItemBaseParams(&typeid(LLPanelInventoryListItemBase::Params), "inventory_list_item");
 
 static const S32 WIDGET_SPACING = 3;
 
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index abb53301a6..92697fb2eb 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -135,7 +135,7 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name,
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelClothingListItem(typeid(LLPanelClothingListItem::Params).name(), "clothing_list_item");
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelClothingListItem(&typeid(LLPanelClothingListItem::Params), "clothing_list_item");
 
 
 LLPanelClothingListItem::Params::Params()
@@ -222,7 +222,7 @@ BOOL LLPanelClothingListItem::postBuild()
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelBodyPartsListItem(typeid(LLPanelBodyPartsListItem::Params).name(), "bodyparts_list_item");
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelBodyPartsListItem(&typeid(LLPanelBodyPartsListItem::Params), "bodyparts_list_item");
 
 
 LLPanelBodyPartsListItem::Params::Params()
@@ -293,7 +293,7 @@ BOOL LLPanelBodyPartsListItem::postBuild()
 	return TRUE;
 }
 
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDeletableWearableListItem(typeid(LLPanelDeletableWearableListItem::Params).name(), "deletable_wearable_list_item");
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDeletableWearableListItem(&typeid(LLPanelDeletableWearableListItem::Params), "deletable_wearable_list_item");
 
 LLPanelDeletableWearableListItem::Params::Params()
 :	delete_btn("delete_btn")
@@ -373,7 +373,7 @@ void LLPanelAttachmentListItem::updateItem(const std::string& name,
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDummyClothingListItem(typeid(LLPanelDummyClothingListItem::Params).name(), "dummy_clothing_list_item");
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDummyClothingListItem(&typeid(LLPanelDummyClothingListItem::Params), "dummy_clothing_list_item");
 
 LLPanelDummyClothingListItem::Params::Params()
 :	add_panel("add_panel"),
-- 
cgit v1.2.3


From fd7bfb03c946b0190bf0965e19b1b679eac3c383 Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Fri, 27 Jul 2012 15:18:29 -0700
Subject: MAINT-1175 FIX Severe performance issues on 3.3.2 (258114) Release
 and 3.3.3 (259197) Beta in "Add scroll list item" removed linear scan for
 namelist items and used weak reference (LLHandle) instead

---
 indra/newview/llnamelistctrl.cpp | 20 +++++++++-----------
 indra/newview/llnamelistctrl.h   | 41 ++++++++++++++++++++--------------------
 2 files changed, 30 insertions(+), 31 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 4e28d1f526..5029d26fda 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -336,7 +336,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
 				// ...schedule a callback
 				LLAvatarNameCache::get(id,
 					boost::bind(&LLNameListCtrl::onAvatarNameCache,
-						this, _1, _2));
+						this, _1, _2, item->getHandle()));
 			}
 			break;
 		}
@@ -392,7 +392,8 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id)
 }
 
 void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
-									   const LLAvatarName& av_name)
+									   const LLAvatarName& av_name,
+									   LLHandle<LLNameListItem> item)
 {
 	std::string name;
 	if (mShortNames)
@@ -400,17 +401,14 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
 	else
 		name = av_name.getCompleteName();
 
-	item_list::iterator iter;
-	for (iter = getItemList().begin(); iter != getItemList().end(); iter++)
+	LLNameListItem* list_item = item.get();
+	if (list_item && list_item->getUUID() == agent_id)
 	{
-		LLScrollListItem* item = *iter;
-		if (item->getUUID() == agent_id)
+		LLScrollListCell* cell = list_item->getColumn(mNameColumnIndex);
+		if (cell)
 		{
-			LLScrollListCell* cell = item->getColumn(mNameColumnIndex);
-			if (cell)
-			{
-				cell->setValue(name);
-			}
+			cell->setValue(name);
+			setNeedsSort();
 		}
 	}
 
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index ca9956dc53..ffacd69db4 100644
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -33,6 +33,26 @@
 
 class LLAvatarName;
 
+/**
+ * LLNameListCtrl item
+ *
+ * We don't use LLScrollListItem to be able to override getUUID(), which is needed
+ * because the name list item value is not simply an UUID but a map (uuid, is_group).
+ */
+class LLNameListItem : public LLScrollListItem, public LLHandleProvider<LLNameListItem>
+{
+public:
+	LLUUID	getUUID() const		{ return getValue()["uuid"].asUUID(); }
+protected:
+	friend class LLNameListCtrl;
+
+	LLNameListItem( const LLScrollListItem::Params& p )
+	:	LLScrollListItem(p)
+	{
+	}
+};
+
+
 class LLNameListCtrl
 :	public LLScrollListCtrl, public LLInstanceTracker<LLNameListCtrl>
 {
@@ -115,7 +135,7 @@ public:
 	/*virtual*/ void	mouseOverHighlightNthItem( S32 index );
 private:
 	void showInspector(const LLUUID& avatar_id, bool is_group);
-	void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
+	void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, LLHandle<LLNameListItem> item);
 
 private:
 	S32    			mNameColumnIndex;
@@ -124,24 +144,5 @@ private:
 	bool			mShortNames;  // display name only, no SLID
 };
 
-/**
- * LLNameListCtrl item
- *
- * We don't use LLScrollListItem to be able to override getUUID(), which is needed
- * because the name list item value is not simply an UUID but a map (uuid, is_group).
- */
-class LLNameListItem : public LLScrollListItem
-{
-public:
-	LLUUID	getUUID() const		{ return getValue()["uuid"].asUUID(); }
-
-protected:
-	friend class LLNameListCtrl;
-
-	LLNameListItem( const LLScrollListItem::Params& p )
-	:	LLScrollListItem(p)
-	{
-	}
-};
 
 #endif
-- 
cgit v1.2.3