summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2021-08-02 14:00:12 +0200
committerMarc Mutz <marc.mutz@kdab.com>2021-08-04 07:31:23 +0200
commite933d71a610a951cc6af3c2ac40b97037a14bf9c (patch)
tree619dc68bc755f30f7e62950242d997d6e5473aa3 /src
parenta46d0b480ba04d77cc01a74c9f2f3ac2203a1248 (diff)
QFsFileEngine: avoid triple(quadruple) lookup of the same key
Instead of contains(), 1-2x operator[](), and remove(), equalling 3-4 separate lookups, use find() + erase(), which does just one lookup. Since our erase() function is C++11-compliant these days and takes const_iterator instead of (mutable) iterator, we can use the const find() overload to delay a detach (attempt) until we actually erase(). Change-Id: I8e67a48e221e548528049fa093ab7ef2f1802f7e Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/io/qfsfileengine_unix.cpp9
-rw-r--r--src/corelib/io/qfsfileengine_win.cpp7
2 files changed, 9 insertions, 7 deletions
diff --git a/src/corelib/io/qfsfileengine_unix.cpp b/src/corelib/io/qfsfileengine_unix.cpp
index a57d924c12..0b3e401be8 100644
--- a/src/corelib/io/qfsfileengine_unix.cpp
+++ b/src/corelib/io/qfsfileengine_unix.cpp
@@ -646,18 +646,19 @@ bool QFSFileEnginePrivate::unmap(uchar *ptr)
{
#if !defined(Q_OS_INTEGRITY)
Q_Q(QFSFileEngine);
- if (!maps.contains(ptr)) {
+ const auto it = std::as_const(maps).find(ptr);
+ if (it == maps.cend()) {
q->setError(QFile::PermissionsError, qt_error_string(EACCES));
return false;
}
- uchar *start = ptr - maps[ptr].first;
- size_t len = maps[ptr].second;
+ uchar *start = ptr - it->first;
+ size_t len = it->second;
if (-1 == munmap(start, len)) {
q->setError(QFile::UnspecifiedError, qt_error_string(errno));
return false;
}
- maps.remove(ptr);
+ maps.erase(it);
return true;
#else
return false;
diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp
index e95eef225b..a0af2cf176 100644
--- a/src/corelib/io/qfsfileengine_win.cpp
+++ b/src/corelib/io/qfsfileengine_win.cpp
@@ -871,17 +871,18 @@ uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size,
bool QFSFileEnginePrivate::unmap(uchar *ptr)
{
Q_Q(QFSFileEngine);
- if (!maps.contains(ptr)) {
+ const auto it = std::as_const(maps).find(ptr);
+ if (it == maps.cend()) {
q->setError(QFile::PermissionsError, qt_error_string(ERROR_ACCESS_DENIED));
return false;
}
- uchar *start = ptr - maps[ptr];
+ uchar *start = ptr - *it;
if (!UnmapViewOfFile(start)) {
q->setError(QFile::PermissionsError, qt_error_string());
return false;
}
- maps.remove(ptr);
+ maps.erase(it);
if (maps.isEmpty()) {
::CloseHandle(mapHandle);
mapHandle = NULL;