Utils: Use ReadWriteLock

Changes usage of QMutex to QReadWriteLock since the cache is read
more often than written.

Change-Id: Ifb29de6c14fecea373bfcb7c92eb6e3450a61811
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Marcus Tillmanns
2023-01-17 15:38:11 +01:00
parent 3e14368d29
commit b5df17cee3

View File

@@ -14,8 +14,9 @@
#include <QFileInfo> #include <QFileInfo>
#include <QLocale> #include <QLocale>
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QMutex> #include <QReadLocker>
#include <QMutexLocker> #include <QReadWriteLock>
#include <QWriteLocker>
static Q_LOGGING_CATEGORY(qrcParserLog, "qtc.qrcParser", QtWarningMsg) static Q_LOGGING_CATEGORY(qrcParserLog, "qtc.qrcParser", QtWarningMsg)
@@ -64,7 +65,7 @@ public:
void clear(); void clear();
private: private:
QHash<QString, QPair<QrcParser::Ptr,int> > m_cache; QHash<QString, QPair<QrcParser::Ptr,int> > m_cache;
QMutex m_mutex; QReadWriteLock m_mutex;
}; };
} // namespace Internal } // namespace Internal
@@ -598,7 +599,7 @@ QrcParser::Ptr QrcCachePrivate::addPath(const QString &path, const QString &cont
{ {
QPair<QrcParser::Ptr,int> currentValue; QPair<QrcParser::Ptr,int> currentValue;
{ {
QMutexLocker l(&m_mutex); QWriteLocker l(&m_mutex);
currentValue = m_cache.value(path, {QrcParser::Ptr(nullptr), 0}); currentValue = m_cache.value(path, {QrcParser::Ptr(nullptr), 0});
currentValue.second += 1; currentValue.second += 1;
if (currentValue.second > 1) { if (currentValue.second > 1) {
@@ -610,7 +611,7 @@ QrcParser::Ptr QrcCachePrivate::addPath(const QString &path, const QString &cont
if (!newParser->isValid()) if (!newParser->isValid())
qCWarning(qrcParserLog) << "adding invalid qrc " << path << " to the cache:" << newParser->errorMessages(); qCWarning(qrcParserLog) << "adding invalid qrc " << path << " to the cache:" << newParser->errorMessages();
{ {
QMutexLocker l(&m_mutex); QWriteLocker l(&m_mutex);
QPair<QrcParser::Ptr,int> currentValue = m_cache.value(path, {QrcParser::Ptr(nullptr), 0}); QPair<QrcParser::Ptr,int> currentValue = m_cache.value(path, {QrcParser::Ptr(nullptr), 0});
if (currentValue.first.isNull()) if (currentValue.first.isNull())
currentValue.first = newParser; currentValue.first = newParser;
@@ -624,7 +625,7 @@ void QrcCachePrivate::removePath(const QString &path)
{ {
QPair<QrcParser::Ptr,int> currentValue; QPair<QrcParser::Ptr,int> currentValue;
{ {
QMutexLocker l(&m_mutex); QWriteLocker l(&m_mutex);
currentValue = m_cache.value(path, {QrcParser::Ptr(nullptr), 0}); currentValue = m_cache.value(path, {QrcParser::Ptr(nullptr), 0});
if (currentValue.second == 1) { if (currentValue.second == 1) {
m_cache.remove(path); m_cache.remove(path);
@@ -641,7 +642,7 @@ QrcParser::Ptr QrcCachePrivate::updatePath(const QString &path, const QString &c
{ {
QrcParser::Ptr newParser = QrcParser::parseQrcFile(path, contents); QrcParser::Ptr newParser = QrcParser::parseQrcFile(path, contents);
{ {
QMutexLocker l(&m_mutex); QWriteLocker l(&m_mutex);
QPair<QrcParser::Ptr,int> currentValue = m_cache.value(path, {QrcParser::Ptr(nullptr), 0}); QPair<QrcParser::Ptr,int> currentValue = m_cache.value(path, {QrcParser::Ptr(nullptr), 0});
currentValue.first = newParser; currentValue.first = newParser;
if (currentValue.second == 0) if (currentValue.second == 0)
@@ -653,14 +654,14 @@ QrcParser::Ptr QrcCachePrivate::updatePath(const QString &path, const QString &c
QrcParser::Ptr QrcCachePrivate::parsedPath(const QString &path) QrcParser::Ptr QrcCachePrivate::parsedPath(const QString &path)
{ {
QMutexLocker l(&m_mutex); QReadLocker l(&m_mutex);
QPair<QrcParser::Ptr,int> currentValue = m_cache.value(path, {QrcParser::Ptr(nullptr), 0}); QPair<QrcParser::Ptr,int> currentValue = m_cache.value(path, {QrcParser::Ptr(nullptr), 0});
return currentValue.first; return currentValue.first;
} }
void QrcCachePrivate::clear() void QrcCachePrivate::clear()
{ {
QMutexLocker l(&m_mutex); QWriteLocker l(&m_mutex);
m_cache.clear(); m_cache.clear();
} }