From 0bd916d9ede3bb3e85ed5a9278498c5e1bb462f5 Mon Sep 17 00:00:00 2001 From: Mnikolenko ProductEngine Date: Mon, 30 Nov 2020 15:57:44 +0200 Subject: [PATCH 1/7] SL-14369 FIXED BugSplat Crash LLAppViewer::cleanup() --- indra/llappearance/llavatarappearance.cpp | 7 +++---- indra/llappearance/llavatarappearance.h | 1 - 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp index 4d36759167..4894f1fe4e 100644 --- a/indra/llappearance/llavatarappearance.cpp +++ b/indra/llappearance/llavatarappearance.cpp @@ -171,7 +171,6 @@ LLAvatarAppearance::LLAvatarXmlInfo::~LLAvatarXmlInfo() //----------------------------------------------------------------------------- // Static Data //----------------------------------------------------------------------------- -LLXmlTree LLAvatarAppearance::sXMLTree; LLXmlTree LLAvatarAppearance::sSkeletonXMLTree; LLAvatarSkeletonInfo* LLAvatarAppearance::sAvatarSkeletonInfo = NULL; LLAvatarAppearance::LLAvatarXmlInfo* LLAvatarAppearance::sAvatarXmlInfo = NULL; @@ -353,14 +352,15 @@ void LLAvatarAppearance::initClass(const std::string& avatar_file_name_arg, cons { avatar_file_name = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,AVATAR_DEFAULT_CHAR + "_lad.xml"); } - BOOL success = sXMLTree.parseFile( avatar_file_name, FALSE ); + LLXmlTree xml_tree; + BOOL success = xml_tree.parseFile( avatar_file_name, FALSE ); if (!success) { LL_ERRS() << "Problem reading avatar configuration file:" << avatar_file_name << LL_ENDL; } // now sanity check xml file - LLXmlTreeNode* root = sXMLTree.getRoot(); + LLXmlTreeNode* root = xml_tree.getRoot(); if (!root) { LL_ERRS() << "No root node found in avatar configuration file: " << avatar_file_name << LL_ENDL; @@ -463,7 +463,6 @@ void LLAvatarAppearance::cleanupClass() delete_and_clear(sAvatarDictionary); delete_and_clear(sAvatarSkeletonInfo); sSkeletonXMLTree.cleanup(); - sXMLTree.cleanup(); } using namespace LLAvatarAppearanceDefines; diff --git a/indra/llappearance/llavatarappearance.h b/indra/llappearance/llavatarappearance.h index d16aeccf0d..4f497c0887 100644 --- a/indra/llappearance/llavatarappearance.h +++ b/indra/llappearance/llavatarappearance.h @@ -211,7 +211,6 @@ public: // XML parse tree //-------------------------------------------------------------------- protected: - static LLXmlTree sXMLTree; // avatar config file static LLXmlTree sSkeletonXMLTree; // avatar skeleton file static LLAvatarSkeletonInfo* sAvatarSkeletonInfo; From 792c086e91c4f66d2cde6a9db7fcc17f9918c3c0 Mon Sep 17 00:00:00 2001 From: Mnikolenko ProductEngine Date: Mon, 30 Nov 2020 20:19:54 +0200 Subject: [PATCH 2/7] SL-14369 Get rid of static sSkeletonXMLTree --- indra/llappearance/llavatarappearance.cpp | 13 ++++++------- indra/llappearance/llavatarappearance.h | 4 +--- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp index 4894f1fe4e..90dfa04f28 100644 --- a/indra/llappearance/llavatarappearance.cpp +++ b/indra/llappearance/llavatarappearance.cpp @@ -171,7 +171,6 @@ LLAvatarAppearance::LLAvatarXmlInfo::~LLAvatarXmlInfo() //----------------------------------------------------------------------------- // Static Data //----------------------------------------------------------------------------- -LLXmlTree LLAvatarAppearance::sSkeletonXMLTree; LLAvatarSkeletonInfo* LLAvatarAppearance::sAvatarSkeletonInfo = NULL; LLAvatarAppearance::LLAvatarXmlInfo* LLAvatarAppearance::sAvatarXmlInfo = NULL; LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary* LLAvatarAppearance::sAvatarDictionary = NULL; @@ -407,8 +406,9 @@ void LLAvatarAppearance::initClass(const std::string& avatar_file_name_arg, cons } std::string skeleton_path; + LLXmlTree skeleton_xml_tree; skeleton_path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,skeleton_file_name); - if (!parseSkeletonFile(skeleton_path)) + if (!parseSkeletonFile(skeleton_path, skeleton_xml_tree)) { LL_ERRS() << "Error parsing skeleton file: " << skeleton_path << LL_ENDL; } @@ -421,7 +421,7 @@ void LLAvatarAppearance::initClass(const std::string& avatar_file_name_arg, cons delete sAvatarSkeletonInfo; } sAvatarSkeletonInfo = new LLAvatarSkeletonInfo; - if (!sAvatarSkeletonInfo->parseXml(sSkeletonXMLTree.getRoot())) + if (!sAvatarSkeletonInfo->parseXml(skeleton_xml_tree.getRoot())) { LL_ERRS() << "Error parsing skeleton XML file: " << skeleton_path << LL_ENDL; } @@ -462,7 +462,6 @@ void LLAvatarAppearance::cleanupClass() delete_and_clear(sAvatarXmlInfo); delete_and_clear(sAvatarDictionary); delete_and_clear(sAvatarSkeletonInfo); - sSkeletonXMLTree.cleanup(); } using namespace LLAvatarAppearanceDefines; @@ -584,12 +583,12 @@ void LLAvatarAppearance::computeBodySize() //----------------------------------------------------------------------------- // parseSkeletonFile() //----------------------------------------------------------------------------- -BOOL LLAvatarAppearance::parseSkeletonFile(const std::string& filename) +BOOL LLAvatarAppearance::parseSkeletonFile(const std::string& filename, LLXmlTree& skeleton_xml_tree) { //------------------------------------------------------------------------- // parse the file //------------------------------------------------------------------------- - BOOL parsesuccess = sSkeletonXMLTree.parseFile( filename, FALSE ); + BOOL parsesuccess = skeleton_xml_tree.parseFile( filename, FALSE ); if (!parsesuccess) { @@ -598,7 +597,7 @@ BOOL LLAvatarAppearance::parseSkeletonFile(const std::string& filename) } // now sanity check xml file - LLXmlTreeNode* root = sSkeletonXMLTree.getRoot(); + LLXmlTreeNode* root = skeleton_xml_tree.getRoot(); if (!root) { LL_ERRS() << "No root node found in avatar skeleton file: " << filename << LL_ENDL; diff --git a/indra/llappearance/llavatarappearance.h b/indra/llappearance/llavatarappearance.h index 4f497c0887..b1c70f9064 100644 --- a/indra/llappearance/llavatarappearance.h +++ b/indra/llappearance/llavatarappearance.h @@ -156,7 +156,7 @@ public: protected: - static BOOL parseSkeletonFile(const std::string& filename); + static BOOL parseSkeletonFile(const std::string& filename, LLXmlTree& skeleton_xml_tree); virtual void buildCharacter(); virtual BOOL loadAvatar(); @@ -211,8 +211,6 @@ public: // XML parse tree //-------------------------------------------------------------------- protected: - static LLXmlTree sSkeletonXMLTree; // avatar skeleton file - static LLAvatarSkeletonInfo* sAvatarSkeletonInfo; static LLAvatarXmlInfo* sAvatarXmlInfo; From e7a98c7dc0e0b431770a659bdd704082f022fbfc Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Wed, 2 Dec 2020 04:03:06 +0200 Subject: [PATCH 3/7] Updated LLCA to codeticket build 553112 --- autobuild.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 94e09550ca..08233ef403 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2187,18 +2187,18 @@ archive hash - 9f4687d7d328b0c13a9e651e805e880a + c541838a933e0714a954e9ef6c89345d hash_algorithm md5 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/71501/691487/llca-202011010215.551526-common-551526.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/73387/708088/llca-202012011600.553112-common-553112.tar.bz2 name common version - 202011010215.551526 + 202012011600.553112 llphysicsextensions_source From 6d842526191ddd199fedfdc0404d648e89c644ba Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Wed, 2 Dec 2020 16:28:45 +0200 Subject: [PATCH 4/7] SL-14422 Get rid of using namespace LLTrace --- indra/newview/llscenemonitor.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp index 2c0c38dc75..3c9ce6b752 100644 --- a/indra/newview/llscenemonitor.cpp +++ b/indra/newview/llscenemonitor.cpp @@ -526,8 +526,7 @@ void LLSceneMonitor::fetchQueryResult() //dump results to a file _scene_xmonitor_results.csv void LLSceneMonitor::dumpToFile(std::string file_name) -{ using namespace LLTrace; - +{ if (!hasResults()) return; LL_INFOS("SceneMonitor") << "Saving scene load stats to " << file_name << LL_ENDL; @@ -536,7 +535,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name) os << std::setprecision(10); - PeriodicRecording& scene_load_recording = mSceneLoadRecording.getResults(); + LLTrace::PeriodicRecording& scene_load_recording = mSceneLoadRecording.getResults(); const U32 frame_count = scene_load_recording.getNumRecordedPeriods(); F64Seconds frame_time; @@ -558,7 +557,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name) os << '\n'; - typedef StatType trace_count; + typedef LLTrace::StatType trace_count; for (auto& it : trace_count::instance_snapshot()) { std::ostringstream row; @@ -576,7 +575,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name) for (S32 frame = 1; frame <= frame_count; frame++) { - Recording& recording = scene_load_recording.getPrevRecording(frame_count - frame); + LLTrace::Recording& recording = scene_load_recording.getPrevRecording(frame_count - frame); samples += recording.getSampleCount(it); row << ", " << recording.getSum(it); } @@ -589,7 +588,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name) } } - typedef StatType trace_event; + typedef LLTrace::StatType trace_event; for (auto& it : trace_event::instance_snapshot()) { @@ -607,7 +606,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name) for (S32 frame = 1; frame <= frame_count; frame++) { - Recording& recording = scene_load_recording.getPrevRecording(frame_count - frame); + LLTrace::Recording& recording = scene_load_recording.getPrevRecording(frame_count - frame); samples += recording.getSampleCount(it); F64 mean = recording.getMean(it); if (llisnan(mean)) @@ -628,7 +627,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name) } } - typedef StatType trace_sample; + typedef LLTrace::StatType trace_sample; for (auto& it : trace_sample::instance_snapshot()) { @@ -646,7 +645,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name) for (S32 frame = 1; frame <= frame_count; frame++) { - Recording& recording = scene_load_recording.getPrevRecording(frame_count - frame); + LLTrace::Recording& recording = scene_load_recording.getPrevRecording(frame_count - frame); samples += recording.getSampleCount(it); F64 mean = recording.getMean(it); if (llisnan(mean)) @@ -667,7 +666,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name) } } - typedef StatType trace_mem; + typedef LLTrace::StatType trace_mem; for (auto& it : trace_mem::instance_snapshot()) { os << it.getName() << "(KiB)"; From 18b664cd76bd849f0cf55865e4b57837c6d62ead Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 3 Dec 2020 01:26:26 +0200 Subject: [PATCH 5/7] SL-14270 A bit of cleanup #3 Just in case and for clarity --- indra/llui/llfolderviewmodel.cpp | 2 ++ indra/newview/llconversationmodel.h | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/llui/llfolderviewmodel.cpp b/indra/llui/llfolderviewmodel.cpp index a028a32704..a2ac9ffaa0 100644 --- a/indra/llui/llfolderviewmodel.cpp +++ b/indra/llui/llfolderviewmodel.cpp @@ -52,11 +52,13 @@ LLFolderViewModelItemCommon::~LLFolderViewModelItemCommon() { // Children don't belong to model, but to LLFolderViewItem, just mark them as having no parent std::for_each(mChildren.begin(), mChildren.end(), [](LLFolderViewModelItem* c) {c->setParent(NULL); }); + mChildren.clear(); // Don't leave dead pointer in parent if (mParent) { mParent->removeChild(this); + mParent = NULL; } } diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index 30c7481864..9787a263c7 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -156,7 +156,8 @@ class LLConversationItemSession : public LLConversationItem public: LLConversationItemSession(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model); LLConversationItemSession(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model); - + virtual ~LLConversationItemSession() {} + /*virtual*/ bool hasChildren() const; LLPointer getIcon() const { return NULL; } void setSessionID(const LLUUID& session_id) { mUUID = session_id; mNeedsRefresh = true; } From 7ab3de94cd10cb6aa9d1f4a6607366edae101464 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 7 Dec 2020 19:29:39 +0200 Subject: [PATCH 6/7] Revert "SL-14270 Crash accessing deleted 'parent' via callback from child" There are random inventory's buildViewsTree crashes in branch with SL-14270 commit and there doesn't seem to be anything else inventory related that could have caused those. Reverting commits to see if it fixes crashes. --- indra/llui/llfolderviewmodel.cpp | 146 ------------------------ indra/llui/llfolderviewmodel.h | 169 ++++++++++++++++++++++------ indra/newview/llconversationmodel.h | 3 +- 3 files changed, 134 insertions(+), 184 deletions(-) diff --git a/indra/llui/llfolderviewmodel.cpp b/indra/llui/llfolderviewmodel.cpp index a2ac9ffaa0..ea106b5fae 100644 --- a/indra/llui/llfolderviewmodel.cpp +++ b/indra/llui/llfolderviewmodel.cpp @@ -29,152 +29,6 @@ #include "llfolderviewmodel.h" #include "lltrans.h" -// LLFolderViewModelItemCommon - -LLFolderViewModelItemCommon::LLFolderViewModelItemCommon(LLFolderViewModelInterface& root_view_model) - : mSortVersion(-1), - mPassedFilter(true), - mPassedFolderFilter(true), - mStringMatchOffsetFilter(std::string::npos), - mStringFilterSize(0), - mFolderViewItem(NULL), - mLastFilterGeneration(-1), - mLastFolderFilterGeneration(-1), - mMarkedDirtyGeneration(-1), - mMostFilteredDescendantGeneration(-1), - mParent(NULL), - mRootViewModel(root_view_model) -{ - mChildren.clear(); //??? -} - -LLFolderViewModelItemCommon::~LLFolderViewModelItemCommon() -{ - // Children don't belong to model, but to LLFolderViewItem, just mark them as having no parent - std::for_each(mChildren.begin(), mChildren.end(), [](LLFolderViewModelItem* c) {c->setParent(NULL); }); - mChildren.clear(); - - // Don't leave dead pointer in parent - if (mParent) - { - mParent->removeChild(this); - mParent = NULL; - } -} - -void LLFolderViewModelItemCommon::dirtyFilter() -{ - if (mMarkedDirtyGeneration < 0) - { - mMarkedDirtyGeneration = mLastFilterGeneration; - } - mLastFilterGeneration = -1; - mLastFolderFilterGeneration = -1; - - // bubble up dirty flag all the way to root - if (mParent) - { - mParent->dirtyFilter(); - } -} - -void LLFolderViewModelItemCommon::dirtyDescendantsFilter() -{ - mMostFilteredDescendantGeneration = -1; - if (mParent) - { - mParent->dirtyDescendantsFilter(); - } -} - -//virtual -void LLFolderViewModelItemCommon::addChild(LLFolderViewModelItem* child) -{ - mChildren.push_back(child); - child->setParent(this); - dirtyFilter(); - requestSort(); -} - -//virtual -void LLFolderViewModelItemCommon::removeChild(LLFolderViewModelItem* child) -{ - mChildren.remove(child); - child->setParent(NULL); - dirtyDescendantsFilter(); - dirtyFilter(); -} - -//virtual -void LLFolderViewModelItemCommon::clearChildren() -{ - // As this is cleaning the whole list of children wholesale, we do need to delete the pointed objects - // This is different and not equivalent to calling removeChild() on each child - std::for_each(mChildren.begin(), mChildren.end(), DeletePointer()); - mChildren.clear(); - dirtyDescendantsFilter(); - dirtyFilter(); -} - -void LLFolderViewModelItemCommon::setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset /*= std::string::npos*/, std::string::size_type string_size /*= 0*/) -{ - mPassedFilter = passed; - mLastFilterGeneration = filter_generation; - mStringMatchOffsetFilter = string_offset; - mStringFilterSize = string_size; - mMarkedDirtyGeneration = -1; -} - -void LLFolderViewModelItemCommon::setPassedFolderFilter(bool passed, S32 filter_generation) -{ - mPassedFolderFilter = passed; - mLastFolderFilterGeneration = filter_generation; -} - -//virtual -bool LLFolderViewModelItemCommon::potentiallyVisible() -{ - return passedFilter() // we've passed the filter - || (getLastFilterGeneration() < mRootViewModel.getFilter().getFirstSuccessGeneration()) // or we don't know yet - || descendantsPassedFilter(); -} - -//virtual -bool LLFolderViewModelItemCommon::passedFilter(S32 filter_generation /*= -1*/) -{ - if (filter_generation < 0) - { - filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration(); - } - bool passed_folder_filter = mPassedFolderFilter && (mLastFolderFilterGeneration >= filter_generation); - bool passed_filter = mPassedFilter && (mLastFilterGeneration >= filter_generation); - return passed_folder_filter && (passed_filter || descendantsPassedFilter(filter_generation)); -} - -//virtual -bool LLFolderViewModelItemCommon::descendantsPassedFilter(S32 filter_generation /*= -1*/) -{ - if (filter_generation < 0) - { - filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration(); - } - return mMostFilteredDescendantGeneration >= filter_generation; -} - -// LLFolderViewModelCommon - -LLFolderViewModelCommon::LLFolderViewModelCommon() - : mTargetSortVersion(0), - mFolderView(NULL) -{} - -//virtual -void LLFolderViewModelCommon::requestSortAll() -{ - // sort everything - mTargetSortVersion++; -} - bool LLFolderViewModelCommon::needsSort(LLFolderViewModelItem* item) { return item->getSortVersion() < mTargetSortVersion; diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index 6e739a57a6..f4ddfa8f18 100644 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -38,6 +38,7 @@ enum EInventorySortGroup SG_ITEM }; +class LLFontGL; class LLInventoryModel; class LLMenuGL; class LLUIImage; @@ -230,43 +231,134 @@ protected: class LLFolderViewModelItemCommon : public LLFolderViewModelItem { public: - LLFolderViewModelItemCommon(LLFolderViewModelInterface& root_view_model); - virtual ~LLFolderViewModelItemCommon() override; + LLFolderViewModelItemCommon(LLFolderViewModelInterface& root_view_model) + : mSortVersion(-1), + mPassedFilter(true), + mPassedFolderFilter(true), + mStringMatchOffsetFilter(std::string::npos), + mStringFilterSize(0), + mFolderViewItem(NULL), + mLastFilterGeneration(-1), + mLastFolderFilterGeneration(-1), + mMarkedDirtyGeneration(-1), + mMostFilteredDescendantGeneration(-1), + mParent(NULL), + mRootViewModel(root_view_model) + { + mChildren.clear(); + } - void requestSort() override { mSortVersion = -1; } - S32 getSortVersion() override { return mSortVersion; } - void setSortVersion(S32 version) override { mSortVersion = version;} + void requestSort() { mSortVersion = -1; } + S32 getSortVersion() { return mSortVersion; } + void setSortVersion(S32 version) { mSortVersion = version;} - S32 getLastFilterGeneration() const override { return mLastFilterGeneration; } + S32 getLastFilterGeneration() const { return mLastFilterGeneration; } S32 getLastFolderFilterGeneration() const { return mLastFolderFilterGeneration; } - S32 getMarkedDirtyGeneration() const override { return mMarkedDirtyGeneration; } - void dirtyFilter() override; - void dirtyDescendantsFilter() override; - bool hasFilterStringMatch() override; - std::string::size_type getFilterStringOffset() override; - std::string::size_type getFilterStringSize() override; + S32 getMarkedDirtyGeneration() const { return mMarkedDirtyGeneration; } + void dirtyFilter() + { + if(mMarkedDirtyGeneration < 0) + { + mMarkedDirtyGeneration = mLastFilterGeneration; + } + mLastFilterGeneration = -1; + mLastFolderFilterGeneration = -1; + + // bubble up dirty flag all the way to root + if (mParent) + { + mParent->dirtyFilter(); + } + } + void dirtyDescendantsFilter() + { + mMostFilteredDescendantGeneration = -1; + if (mParent) + { + mParent->dirtyDescendantsFilter(); + } + } + bool hasFilterStringMatch(); + std::string::size_type getFilterStringOffset(); + std::string::size_type getFilterStringSize(); typedef std::list child_list_t; - virtual void addChild(LLFolderViewModelItem* child) override; - virtual void removeChild(LLFolderViewModelItem* child) override; + virtual void addChild(LLFolderViewModelItem* child) + { + mChildren.push_back(child); + child->setParent(this); + dirtyFilter(); + requestSort(); + } + virtual void removeChild(LLFolderViewModelItem* child) + { + mChildren.remove(child); + child->setParent(NULL); + dirtyDescendantsFilter(); + dirtyFilter(); + } - virtual void clearChildren(); + virtual void clearChildren() + { + // As this is cleaning the whole list of children wholesale, we do need to delete the pointed objects + // This is different and not equivalent to calling removeChild() on each child + std::for_each(mChildren.begin(), mChildren.end(), DeletePointer()); + mChildren.clear(); + dirtyDescendantsFilter(); + dirtyFilter(); + } child_list_t::const_iterator getChildrenBegin() const { return mChildren.begin(); } child_list_t::const_iterator getChildrenEnd() const { return mChildren.end(); } child_list_t::size_type getChildrenCount() const { return mChildren.size(); } - void setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) override; - void setPassedFolderFilter(bool passed, S32 filter_generation) override; - virtual bool potentiallyVisible() override; - virtual bool passedFilter(S32 filter_generation = -1) override; - virtual bool descendantsPassedFilter(S32 filter_generation = -1) override; + void setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) + { + mPassedFilter = passed; + mLastFilterGeneration = filter_generation; + mStringMatchOffsetFilter = string_offset; + mStringFilterSize = string_size; + mMarkedDirtyGeneration = -1; + } + + void setPassedFolderFilter(bool passed, S32 filter_generation) + { + mPassedFolderFilter = passed; + mLastFolderFilterGeneration = filter_generation; + } + + virtual bool potentiallyVisible() + { + return passedFilter() // we've passed the filter + || (getLastFilterGeneration() < mRootViewModel.getFilter().getFirstSuccessGeneration()) // or we don't know yet + || descendantsPassedFilter(); + } + + virtual bool passedFilter(S32 filter_generation = -1) + { + if (filter_generation < 0) + { + filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration(); + } + bool passed_folder_filter = mPassedFolderFilter && (mLastFolderFilterGeneration >= filter_generation); + bool passed_filter = mPassedFilter && (mLastFilterGeneration >= filter_generation); + return passed_folder_filter && (passed_filter || descendantsPassedFilter(filter_generation)); + } + + virtual bool descendantsPassedFilter(S32 filter_generation = -1) + { + if (filter_generation < 0) + { + filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration(); + } + return mMostFilteredDescendantGeneration >= filter_generation; + } protected: - virtual void setParent(LLFolderViewModelItem* parent) override { mParent = parent; } - virtual bool hasParent() override { return mParent != NULL; } + virtual void setParent(LLFolderViewModelItem* parent) { mParent = parent; } + virtual bool hasParent() { return mParent != NULL; } S32 mSortVersion; bool mPassedFilter; @@ -283,7 +375,7 @@ protected: LLFolderViewModelItem* mParent; LLFolderViewModelInterface& mRootViewModel; - void setFolderViewItem(LLFolderViewItem* folder_view_item) override { mFolderViewItem = folder_view_item;} + void setFolderViewItem(LLFolderViewItem* folder_view_item) { mFolderViewItem = folder_view_item;} LLFolderViewItem* mFolderViewItem; }; @@ -292,15 +384,20 @@ protected: class LLFolderViewModelCommon : public LLFolderViewModelInterface { public: - LLFolderViewModelCommon(); + LLFolderViewModelCommon() + : mTargetSortVersion(0), + mFolderView(NULL) + {} - virtual ~LLFolderViewModelCommon() override {} + virtual void requestSortAll() + { + // sort everything + mTargetSortVersion++; + } + virtual std::string getStatusText(); + virtual void filter(); - virtual void requestSortAll() override; - virtual std::string getStatusText() override; - virtual void filter() override; - - void setFolderView(LLFolderView* folder_view) override { mFolderView = folder_view;} + void setFolderView(LLFolderView* folder_view) { mFolderView = folder_view;} protected: bool needsSort(class LLFolderViewModelItem* item); @@ -324,7 +421,7 @@ public: mFilter(filter) {} - virtual ~LLFolderViewModel() override + virtual ~LLFolderViewModel() { delete mSorter; mSorter = NULL; @@ -336,14 +433,14 @@ public: virtual const SortType& getSorter() const { return *mSorter; } virtual void setSorter(const SortType& sorter) { mSorter = new SortType(sorter); requestSortAll(); } - virtual FilterType& getFilter() override { return *mFilter; } - virtual const FilterType& getFilter() const override { return *mFilter; } + virtual FilterType& getFilter() { return *mFilter; } + virtual const FilterType& getFilter() const { return *mFilter; } virtual void setFilter(const FilterType& filter) { mFilter = new FilterType(filter); } // By default, we assume the content is available. If a network fetch mechanism is implemented for the model, // this method needs to be overloaded and return the relevant fetch status. - virtual bool contentsReady() override { return true; } - virtual bool isFolderComplete(LLFolderViewFolder* folder) override { return true; } + virtual bool contentsReady() { return true; } + virtual bool isFolderComplete(LLFolderViewFolder* folder) { return true; } struct ViewModelCompare { @@ -364,7 +461,7 @@ public: const SortType& mSorter; }; - void sort(LLFolderViewFolder* folder) override + void sort(LLFolderViewFolder* folder) { if (needsSort(folder->getViewModelItem())) { diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index 9787a263c7..30c7481864 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -156,8 +156,7 @@ class LLConversationItemSession : public LLConversationItem public: LLConversationItemSession(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model); LLConversationItemSession(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model); - virtual ~LLConversationItemSession() {} - + /*virtual*/ bool hasChildren() const; LLPointer getIcon() const { return NULL; } void setSessionID(const LLUUID& session_id) { mUUID = session_id; mNeedsRefresh = true; } From 0a4cf47f5fa3f9e95b9a865a0d99e5f21eacbc85 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 7 Dec 2020 23:22:53 +0200 Subject: [PATCH 7/7] SL-14484 'Stop All' media button sometomes is not avaliable for video --- indra/newview/llviewermedia.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 534a67195e..9ed2df2759 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -194,7 +194,6 @@ static F32 sGlobalVolume = 1.0f; static bool sForceUpdate = false; static LLUUID sOnlyAudibleTextureID = LLUUID::null; static F64 sLowestLoadableImplInterest = 0.0f; -static bool sAnyMediaShowing = false; ////////////////////////////////////////////////////////////////////////////////////////// static void add_media_impl(LLViewerMediaImpl* media) @@ -866,7 +865,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) if (!pimpl->getUsedInUI() && pimpl->hasMedia()) { - sAnyMediaShowing = true; + mAnyMediaShowing = true; } if (!pimpl->getUsedInUI() && pimpl->hasMedia() && (pimpl->isMediaPlaying() || !pimpl->isMediaTimeBased()))