From 6ec41bd550703aa06ed772fb0f58b7395db40fd3 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 4 Jun 2020 17:39:20 +0200 Subject: [PATCH] QSsl: port a local QStringList to QDuplicateTracker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 code is the first user of the collected data, so make that available by adding QDuplicateTracker::appendTo(Container&) methods. Change-Id: Ibd8810c0070db7e6b3ead6d6a569facdab88b646 Reviewed-by: MÃ¥rten Nordheim --- src/corelib/tools/qduplicatetracker_p.h | 14 ++++++++++++++ src/network/ssl/qsslsocket_openssl_symbols.cpp | 9 +++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/corelib/tools/qduplicatetracker_p.h b/src/corelib/tools/qduplicatetracker_p.h index cd57d4aed5c..baf21bfd126 100644 --- a/src/corelib/tools/qduplicatetracker_p.h +++ b/src/corelib/tools/qduplicatetracker_p.h @@ -99,6 +99,20 @@ public: #endif return !inserted; } + + template + void appendTo(C &c) const & + { + for (const auto &e : set) + c.push_back(e); + } + + template + void appendTo(C &c) && + { + for (auto &e : set) + c.push_back(std::move(e)); + } }; QT_END_NAMESPACE diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp index 6ba8ba9db06..17563333718 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols.cpp +++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp @@ -68,6 +68,7 @@ #include #endif #include +#include #if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID) #include #endif @@ -569,13 +570,13 @@ static int dlIterateCallback(struct dl_phdr_info *info, size_t size, void *data) { if (size < sizeof (info->dlpi_addr) + sizeof (info->dlpi_name)) return 1; - QSet *paths = (QSet *)data; + QDuplicateTracker *paths = (QDuplicateTracker *)data; QString path = QString::fromLocal8Bit(info->dlpi_name); if (!path.isEmpty()) { QFileInfo fi(path); path = fi.absolutePath(); if (!path.isEmpty()) - paths->insert(path); + (void)paths->hasSeen(std::move(path)); } return 0; } @@ -608,9 +609,9 @@ static QStringList libraryPathList() paths << QLatin1String("/system/lib"); #elif defined(Q_OS_LINUX) // discover paths of already loaded libraries - QSet loadedPaths; + QDuplicateTracker loadedPaths; dl_iterate_phdr(dlIterateCallback, &loadedPaths); - paths.append(loadedPaths.values()); + std::move(loadedPaths).appendTo(paths); #endif return paths;