From 20649ec027a6da0994819c0ce18c4862f8ff66f9 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sat, 23 May 2020 23:08:05 +0200 Subject: Fix issues with very slow refresh time for large root data directories. --- src/shared/directoryentry.cpp | 32 +++----------------------------- src/shared/directoryentry.h | 21 ++++++++++----------- 2 files changed, 13 insertions(+), 40 deletions(-) (limited to 'src/shared') diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index 43408dcf..c4b467d6 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -67,7 +67,8 @@ static bool SupportOptimizedFind() return (::VerifyVersionInfo(&versionInfo, VER_MAJORVERSION | VER_MINORVERSION, mask) == TRUE); } -static bool DirCompareByName(const DirectoryEntry* lhs, const DirectoryEntry* rhs) +bool DirCompareByName::operator()( + const DirectoryEntry* lhs, const DirectoryEntry* rhs) const { return _wcsicmp(lhs->getName().c_str(), rhs->getName().c_str()) < 0; } @@ -156,13 +157,6 @@ void DirectoryEntry::addDir( } }); - elapsed(stats.sortTimes, [&]{ - std::sort( - m_SubDirectories.begin(), - m_SubDirectories.end(), - &DirCompareByName); - }); - m_Populated = true; } @@ -647,15 +641,6 @@ void DirectoryEntry::addFiles( onFile((Context*)pcx, path, ft); } ); - - { - std::scoped_lock lock(m_SubDirMutex); - - std::sort( - m_SubDirectories.begin(), - m_SubDirectories.end(), - &DirCompareByName); - } } void DirectoryEntry::onDirectoryStart(Context* cx, std::wstring_view path) @@ -671,17 +656,6 @@ void DirectoryEntry::onDirectoryStart(Context* cx, std::wstring_view path) void DirectoryEntry::onDirectoryEnd(Context* cx, std::wstring_view path) { elapsed(cx->stats.dirTimes, [&] { - auto* current = cx->current.top(); - - { - std::scoped_lock lock(current->m_SubDirMutex); - - std::sort( - current->m_SubDirectories.begin(), - current->m_SubDirectories.end(), - &DirCompareByName); - } - cx->current.pop(); }); } @@ -842,7 +816,7 @@ void DirectoryEntry::removeDirRecursive() void DirectoryEntry::addDirectoryToList(DirectoryEntry* e, std::wstring nameLc) { - m_SubDirectories.push_back(e); + m_SubDirectories.insert(e); m_SubDirectoriesLookup.emplace(std::move(nameLc), e); } diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h index a28ceeae..0ee3c919 100644 --- a/src/shared/directoryentry.h +++ b/src/shared/directoryentry.h @@ -46,10 +46,18 @@ namespace std namespace MOShared { +struct DirCompareByName +{ + bool operator()(const DirectoryEntry* a, const DirectoryEntry* b) const; +}; + + class DirectoryEntry { public: - DirectoryEntry( + using SubDirectories = std::set; + + DirectoryEntry( std::wstring name, DirectoryEntry* parent, OriginID originID); DirectoryEntry( @@ -137,15 +145,7 @@ public: std::vector getFiles() const; - void getSubDirectories( - std::vector::const_iterator& begin, - std::vector::const_iterator& end) const - { - begin = m_SubDirectories.begin(); - end = m_SubDirectories.end(); - } - - const std::vector& getSubDirectories() const + const SubDirectories& getSubDirectories() const { return m_SubDirectories; } @@ -238,7 +238,6 @@ public: private: using FilesMap = std::map; using FilesLookup = std::unordered_map; - using SubDirectories = std::vector; using SubDirectoriesLookup = std::unordered_map; boost::shared_ptr m_FileRegister; -- cgit v1.3.1