diff --git a/.gitignore b/.gitignore
index a8c150ae66..f94d376ae5 100755
--- a/.gitignore
+++ b/.gitignore
@@ -106,3 +106,5 @@ my_autobuild.xml
*.srctrlprj
compile_commands.json
+# ignore tracy for now
+indra/tracy
\ No newline at end of file
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index f5206462a4..8b6e01a9ca 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -2915,10 +2915,20 @@ void LLScrollListCtrl::sortByColumnIndex(U32 column, BOOL ascending)
updateSort();
}
+// FIRE-30667 et al. Group hang issues (grab settings)
+extern LLControlGroup gSavedSettings;
void LLScrollListCtrl::updateSort() const
{
- if (hasSortOrder() && !isSorted())
+ // FIRE-30667 et al. Group hang issues
+ // if (hasSortOrder() && !isSorted())
+ // {
+ static LLCachedControl sortDeferFrameCount( gSavedSettings, "FSSortDeferalFrames" );
+ if ( hasSortOrder() && !isSorted() && ( mLastUpdateFrame > 1 && ( LLFrameTimer::getFrameCount() - mLastUpdateFrame ) >= sortDeferFrameCount ) )
+ // encoding two (unlikely) special values into mLastUpdateFrame 1 means we've sorted and 0 means we've nothing new to do.
+ // 0 is set after sorting, 1 can be set by a parent for any post sorting action.
{
+ mLastUpdateFrame=0;
+ //
// do stable sort to preserve any previous sorts
std::stable_sort(
mItemList.begin(),
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 0b36bc204d..b6cc6590ed 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -412,7 +412,9 @@ public:
void sortOnce(S32 column, BOOL ascending);
// manually call this whenever editing list items in place to flag need for resorting
- void setNeedsSort(bool val = true) { mSorted = !val; }
+ // FIRE-30667 et al. Avoid hangs on large list updates
+ // void setNeedsSort(bool val = true) { mSorted = !val; }
+ void setNeedsSort(bool val = true) { mSorted = !val; mLastUpdateFrame = LLFrameTimer::getFrameCount(); }
void dirtyColumns(); // some operation has potentially affected column layout or ordering
boost::signals2::connection setSortCallback(sort_signal_t::slot_type cb )
@@ -452,6 +454,8 @@ protected:
public:
void updateLineHeight();
+ // FIRE-30667 et al. Avoid hangs on large list updates
+ mutable U32 mLastUpdateFrame;
private:
void selectPrevItem(BOOL extend_selection);
@@ -478,6 +482,7 @@ private:
static void copyNameToClipboard(std::string id, bool is_group);
static void copySLURLToClipboard(std::string id, bool is_group);
+
S32 mLineHeight; // the max height of a single line
S32 mScrollLines; // how many lines we've scrolled down
S32 mPageLines; // max number of lines is it possible to see on the screen given mRect and mLineHeight
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 36d3d5ce87..333e1eaa20 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -344,6 +344,17 @@
Value
0
+ FSSortDeferalFrames
+
FSGroupNotifyNoTransparency