summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2023-05-03 09:11:28 +0200
committerDavid Schulz <david.schulz@qt.io>2023-05-08 09:39:21 +0000
commit0e4a7d5207c522c1d25d03212777b00b79b0e360 (patch)
tree91e5a52b1bb9bb64285f7877c9dd14c8f53a448e
parent78fe0c315ee18358f0aa2bc3452d3d19efac73b4 (diff)
downloadqt-creator-0e4a7d5207c522c1d25d03212777b00b79b0e360.tar.gz
Utils: Avoid watching directories of watched files
Do not watch directories unconditionally, but only if they contain removed files to check whether those files are readded. This should reduce the number of needlesly watched directories to a minimum and fix performance regressions introduced by 61598eca15e14af64c20d314db382973dfccb2d2. Fixes: QTCREATORBUG-28957 Change-Id: I8fe387e7de32b0fb585074330c7f6ca7eae44730 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Ulf Hermann <ulf.hermann@qt.io> Reviewed-by: hjk <hjk@qt.io>
-rw-r--r--src/libs/utils/filesystemwatcher.cpp59
1 files changed, 46 insertions, 13 deletions
diff --git a/src/libs/utils/filesystemwatcher.cpp b/src/libs/utils/filesystemwatcher.cpp
index 3f427cce2e..ad7f77c10e 100644
--- a/src/libs/utils/filesystemwatcher.cpp
+++ b/src/libs/utils/filesystemwatcher.cpp
@@ -275,15 +275,19 @@ void FileSystemWatcher::addFiles(const QStringList &files, WatchMode wm)
const int count = ++d->m_staticData->m_fileCount[file];
Q_ASSERT(count > 0);
- if (count == 1)
+ if (count == 1) {
toAdd << file;
- const QString directory = QFileInfo(file).path();
- const int dirCount = ++d->m_staticData->m_directoryCount[directory];
- Q_ASSERT(dirCount > 0);
+ QFileInfo fi(file);
+ if (!fi.exists()) {
+ const QString directory = fi.path();
+ const int dirCount = ++d->m_staticData->m_directoryCount[directory];
+ Q_ASSERT(dirCount > 0);
- if (dirCount == 1)
- toAdd << directory;
+ if (dirCount == 1)
+ toAdd << directory;
+ }
+ }
}
if (!toAdd.isEmpty())
@@ -311,15 +315,19 @@ void FileSystemWatcher::removeFiles(const QStringList &files)
const int count = --(d->m_staticData->m_fileCount[file]);
Q_ASSERT(count >= 0);
- if (!count)
+ if (!count) {
toRemove << file;
- const QString directory = QFileInfo(file).path();
- const int dirCount = --d->m_staticData->m_directoryCount[directory];
- Q_ASSERT(dirCount >= 0);
+ QFileInfo fi(file);
+ if (!fi.exists()) {
+ const QString directory = fi.path();
+ const int dirCount = --d->m_staticData->m_directoryCount[directory];
+ Q_ASSERT(dirCount >= 0);
- if (!dirCount)
- toRemove << directory;
+ if (!dirCount)
+ toRemove << directory;
+ }
+ }
}
if (!toRemove.isEmpty())
@@ -418,13 +426,27 @@ QStringList FileSystemWatcher::directories() const
void FileSystemWatcher::slotFileChanged(const QString &path)
{
const auto it = d->m_files.find(path);
+ QStringList toAdd;
if (it != d->m_files.end() && it.value().trigger(path)) {
if (debug)
qDebug() << this << "triggers on file " << path
<< it.value().watchMode
<< it.value().modifiedTime.toString(Qt::ISODate);
d->fileChanged(path);
+
+ QFileInfo fi(path);
+ if (!fi.exists()) {
+ const QString directory = fi.path();
+ const int dirCount = ++d->m_staticData->m_directoryCount[directory];
+ Q_ASSERT(dirCount > 0);
+
+ if (dirCount == 1)
+ toAdd << directory;
+ }
}
+
+ if (!toAdd.isEmpty())
+ d->m_staticData->m_watcher->addPaths(toAdd);
}
void FileSystemWatcher::slotDirectoryChanged(const QString &path)
@@ -450,9 +472,20 @@ void FileSystemWatcher::slotDirectoryChanged(const QString &path)
for (const QString &rejected : d->m_staticData->m_watcher->addPaths(toReadd))
toReadd.removeOne(rejected);
+ QStringList toRemove;
// If we've successfully added the file, that means it was deleted and replaced.
- for (const QString &reAdded : std::as_const(toReadd))
+ for (const QString &reAdded : std::as_const(toReadd)) {
d->fileChanged(reAdded);
+ const QString directory = QFileInfo(reAdded).path();
+ const int dirCount = --d->m_staticData->m_directoryCount[directory];
+ Q_ASSERT(dirCount >= 0);
+
+ if (!dirCount)
+ toRemove << directory;
+ }
+
+ if (!toRemove.isEmpty())
+ d->m_staticData->m_watcher->removePaths(toRemove);
}
}