Fix return value of QWindowsFileSystemWatcherEngine::removePaths().

Previously, the path was removed from list returned (indicating failure
to remove) only when the thread's list was empty
(last file in directory). Move the statement up so that removal
happens when it is found in thread's list.

Task-number: QTBUG-46449
Change-Id: Ib79199c731f79357b0e5c17636254fbeb3a754a0
Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
This commit is contained in:
Friedemann Kleint 2015-06-09 09:53:18 +02:00
parent b38615c7e4
commit bf440c18bb
2 changed files with 27 additions and 2 deletions

View File

@ -248,6 +248,7 @@ QStringList QWindowsFileSystemWatcherEngine::removePaths(const QStringList &path
// ###
files->removeAll(path);
directories->removeAll(path);
it.remove();
if (h.isEmpty()) {
DEBUG() << "Closing handle" << handle.handle;
@ -260,8 +261,6 @@ QStringList QWindowsFileSystemWatcherEngine::removePaths(const QStringList &path
thread->handleForDir.remove(QFileSystemWatcherPathKey(absolutePath));
// h is now invalid
it.remove();
if (thread->handleForDir.isEmpty()) {
DEBUG() << "Stopping thread " << thread;
locker.unlock();

View File

@ -62,6 +62,7 @@ private slots:
void removePath();
void addPaths();
void removePaths();
void removePathsFilesInSameDirectory();
void watchFileAndItsDirectory_data() { basicTest_data(); }
void watchFileAndItsDirectory();
@ -460,6 +461,31 @@ void tst_QFileSystemWatcher::removePaths()
watcher.removePaths(paths);
}
void tst_QFileSystemWatcher::removePathsFilesInSameDirectory()
{
// QTBUG-46449/Windows: Check the return values of removePaths().
// When adding the 1st file, a thread is started to watch the temp path.
// After adding and removing the 2nd file, the thread is still running and
// success should be reported.
QTemporaryFile file1(m_tempDirPattern);
QTemporaryFile file2(m_tempDirPattern);
QVERIFY2(file1.open(), qPrintable(file1.errorString()));
QVERIFY2(file2.open(), qPrintable(file1.errorString()));
const QString path1 = file1.fileName();
const QString path2 = file2.fileName();
file1.close();
file2.close();
QFileSystemWatcher watcher;
QVERIFY(watcher.addPath(path1));
QCOMPARE(watcher.files().size(), 1);
QVERIFY(watcher.addPath(path2));
QCOMPARE(watcher.files().size(), 2);
QVERIFY(watcher.removePath(path1));
QCOMPARE(watcher.files().size(), 1);
QVERIFY(watcher.removePath(path2));
QCOMPARE(watcher.files().size(), 0);
}
static QByteArray msgFileOperationFailed(const char *what, const QFile &f)
{
return what + QByteArrayLiteral(" failed on \"")