summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2020-06-04 17:39:20 +0200
committerMarc Mutz <marc.mutz@kdab.com>2020-06-08 10:53:20 +0000
commit6ec41bd550703aa06ed772fb0f58b7395db40fd3 (patch)
tree8f3fdb7b643a50c8b31c5937cd7ab61e139b6b80 /src
parent48b1bc48f1367a47d0c522b4106eb6eba5c699b8 (diff)
QSsl: port a local QStringList 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 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 <marten.nordheim@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/tools/qduplicatetracker_p.h14
-rw-r--r--src/network/ssl/qsslsocket_openssl_symbols.cpp9
2 files changed, 19 insertions, 4 deletions
diff --git a/src/corelib/tools/qduplicatetracker_p.h b/src/corelib/tools/qduplicatetracker_p.h
index cd57d4aed5..baf21bfd12 100644
--- a/src/corelib/tools/qduplicatetracker_p.h
+++ b/src/corelib/tools/qduplicatetracker_p.h
@@ -99,6 +99,20 @@ public:
#endif
return !inserted;
}
+
+ template <typename C>
+ void appendTo(C &c) const &
+ {
+ for (const auto &e : set)
+ c.push_back(e);
+ }
+
+ template <typename C>
+ 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 6ba8ba9db0..1756333371 100644
--- a/src/network/ssl/qsslsocket_openssl_symbols.cpp
+++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp
@@ -68,6 +68,7 @@
#include <QtCore/qdir.h>
#endif
#include <QtCore/private/qmemory_p.h>
+#include <QtCore/private/qduplicatetracker_p.h>
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
#include <link.h>
#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<QString> *paths = (QSet<QString> *)data;
+ QDuplicateTracker<QString> *paths = (QDuplicateTracker<QString> *)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<QString> loadedPaths;
+ QDuplicateTracker<QString> loadedPaths;
dl_iterate_phdr(dlIterateCallback, &loadedPaths);
- paths.append(loadedPaths.values());
+ std::move(loadedPaths).appendTo(paths);
#endif
return paths;