summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2020-05-23 23:08:05 +0200
committerMikaƫl Capelle <capelle.mikael@gmail.com>2020-05-23 23:08:33 +0200
commit20649ec027a6da0994819c0ce18c4862f8ff66f9 (patch)
tree7def64062ef136e0dfddb75899316e5562d4d108
parentfceca422db04ae9d8cd9ca5e2e21a06697293937 (diff)
Fix issues with very slow refresh time for large root data directories.
-rw-r--r--src/organizercore.cpp16
-rw-r--r--src/shared/directoryentry.cpp32
-rw-r--r--src/shared/directoryentry.h21
3 files changed, 19 insertions, 50 deletions
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index a6d6e34f..feab76a7 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -834,10 +834,8 @@ QStringList OrganizerCore::listDirectories(const QString &directoryName) const
if (!directoryName.isEmpty())
dir = dir->findSubDirectoryRecursive(ToWString(directoryName));
if (dir != nullptr) {
- std::vector<DirectoryEntry *>::iterator current, end;
- dir->getSubDirectories(current, end);
- for (; current != end; ++current) {
- result.append(ToQString((*current)->getName()));
+ for (const auto& d : dir->getSubDirectories()) {
+ result.append(ToQString(d->getName()));
}
}
return result;
@@ -1926,14 +1924,12 @@ std::vector<Mapping> OrganizerCore::fileMapping(
}
// recurse into subdirectories
- std::vector<DirectoryEntry *>::const_iterator current, end;
- directoryEntry->getSubDirectories(current, end);
- for (; current != end; ++current) {
- int origin = (*current)->anyOrigin();
+ for (const auto& d : directoryEntry->getSubDirectories()) {
+ int origin = d->anyOrigin();
QString originPath
= QString::fromStdWString(base->getOriginByID(origin).getPath());
- QString dirName = QString::fromStdWString((*current)->getName());
+ QString dirName = QString::fromStdWString(d->getName());
QString source = originPath + relPath + dirName;
QString target = dataPath + relPath + dirName;
@@ -1942,7 +1938,7 @@ std::vector<Mapping> OrganizerCore::fileMapping(
result.push_back({source, target, true, writeDestination});
std::vector<Mapping> subRes = fileMapping(
- dataPath, relPath + dirName + "\\", base, *current, createDestination);
+ dataPath, relPath + dirName + "\\", base, d, createDestination);
result.insert(result.end(), subRes.begin(), subRes.end());
}
return result;
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*, DirCompareByName>;
+
+ DirectoryEntry(
std::wstring name, DirectoryEntry* parent, OriginID originID);
DirectoryEntry(
@@ -137,15 +145,7 @@ public:
std::vector<FileEntryPtr> getFiles() const;
- void getSubDirectories(
- std::vector<DirectoryEntry*>::const_iterator& begin,
- std::vector<DirectoryEntry*>::const_iterator& end) const
- {
- begin = m_SubDirectories.begin();
- end = m_SubDirectories.end();
- }
-
- const std::vector<DirectoryEntry*>& getSubDirectories() const
+ const SubDirectories& getSubDirectories() const
{
return m_SubDirectories;
}
@@ -238,7 +238,6 @@ public:
private:
using FilesMap = std::map<std::wstring, FileIndex>;
using FilesLookup = std::unordered_map<DirectoryEntryFileKey, FileIndex>;
- using SubDirectories = std::vector<DirectoryEntry*>;
using SubDirectoriesLookup = std::unordered_map<std::wstring, DirectoryEntry*>;
boost::shared_ptr<FileRegister> m_FileRegister;