summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/io/qdir.cpp26
-rw-r--r--src/corelib/io/qdir_p.h2
2 files changed, 20 insertions, 8 deletions
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp
index 21204ff10b..b08595bf14 100644
--- a/src/corelib/io/qdir.cpp
+++ b/src/corelib/io/qdir.cpp
@@ -100,7 +100,7 @@ QDirPrivate::QDirPrivate(const QDirPrivate &copy)
dirEntry(copy.dirEntry)
{
QMutexLocker locker(&copy.fileCache.mutex);
- fileCache.fileListsInitialized = copy.fileCache.fileListsInitialized;
+ fileCache.fileListsInitialized = copy.fileCache.fileListsInitialized.load();
fileCache.files = copy.fileCache.files;
fileCache.fileInfos = copy.fileCache.fileInfos;
fileCache.absoluteDirEntry = copy.fileCache.absoluteDirEntry;
@@ -1378,17 +1378,29 @@ QStringList QDir::entryList(const QStringList &nameFilters, Filters filters,
if (sort == NoSort)
sort = d->sort;
+ const bool needsSorting = (sort & QDir::SortByMask) != QDir::Unsorted;
+
if (filters == d->filters && sort == d->sort && nameFilters == d->nameFilters) {
- d->initFileLists(*this);
- return d->fileCache.files;
+ // Don't fill a QFileInfo cache if we just need names
+ if (needsSorting || d->fileCache.fileListsInitialized) {
+ d->initFileLists(*this);
+ return d->fileCache.files;
+ }
}
- QFileInfoList l;
QDirIterator it(d->dirEntry.filePath(), nameFilters, filters);
- while (it.hasNext())
- l.append(it.nextFileInfo());
QStringList ret;
- d->sortFileList(sort, l, &ret, nullptr);
+ if (needsSorting) {
+ QFileInfoList l;
+ while (it.hasNext())
+ l.append(it.nextFileInfo());
+ d->sortFileList(sort, l, &ret, nullptr);
+ } else {
+ while (it.hasNext()) {
+ it.next();
+ ret.append(it.fileName());
+ }
+ }
return ret;
}
diff --git a/src/corelib/io/qdir_p.h b/src/corelib/io/qdir_p.h
index 3e033b2ad2..7dce69c195 100644
--- a/src/corelib/io/qdir_p.h
+++ b/src/corelib/io/qdir_p.h
@@ -71,7 +71,7 @@ public:
QMutex mutex;
QStringList files;
QFileInfoList fileInfos;
- bool fileListsInitialized = false;
+ std::atomic<bool> fileListsInitialized = false;
QFileSystemEntry absoluteDirEntry;
QFileSystemMetaData metaData;
};