From 0f2869fcdc0932478c0745bda6e6c70a57b8ad47 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sat, 2 May 2020 23:03:39 +0200 Subject: [PATCH] QDirIterator: port visitedLinks from QSet to QDuplicateTracker Apart from a more fitting, minimal, API, QDuplicateTracker also transparently uses C++17 pmr::monotonic_buffer_resource to avoid, or at least reduce, memory allocations. The old code performed the visitedLinks check unconditionally, but since we add entries to visitedLinks only when following symlinks (and this property cannot be changed under iteration, as `iteratorFlags` is a const member), the new code only performs the check conditionally, with unchanged semantics. Change-Id: Ia2c2dda16136ef5256e2c345b8ecba530883ee37 Reviewed-by: Thiago Macieira --- src/corelib/io/qdiriterator.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/corelib/io/qdiriterator.cpp b/src/corelib/io/qdiriterator.cpp index f6d337bb74..7128435aa4 100644 --- a/src/corelib/io/qdiriterator.cpp +++ b/src/corelib/io/qdiriterator.cpp @@ -108,6 +108,7 @@ #include #include #include +#include #include @@ -159,7 +160,7 @@ public: QFileInfo nextFileInfo; // Loop protection - QSet visitedLinks; + QDuplicateTracker visitedLinks; }; /*! @@ -210,12 +211,11 @@ void QDirIteratorPrivate::pushDirectory(const QFileInfo &fileInfo) path = fileInfo.canonicalFilePath(); #endif - // Stop link loops - if (visitedLinks.contains(fileInfo.canonicalFilePath())) - return; - - if (iteratorFlags & QDirIterator::FollowSymlinks) - visitedLinks << fileInfo.canonicalFilePath(); + if ((iteratorFlags & QDirIterator::FollowSymlinks)) { + // Stop link loops + if (visitedLinks.hasSeen(fileInfo.canonicalFilePath())) + return; + } if (engine) { engine->setFileName(path);