summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Weimer <bernd.weimer@qt.io>2021-03-19 16:10:59 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-01-19 08:21:20 +0000
commita7b9a67c56cc3fa22a23eb734b248d1987eeeec2 (patch)
treefc3373d15b13bd906cfdaeefbe3af9c095b08ba9
parent7844c5eaffc798a59612c31e76c04b8ba3d4e0aa (diff)
downloadqtapplicationmanager-a7b9a67c56cc3fa22a23eb734b248d1987eeeec2.tar.gz
Fix deferred logging crash
If more than one configuration file is used, parsing is done concurrently and hence debug output might be generated in parallel. Appending output to the deferred messages vector was however not thread safe. A mutex has been added to remedy this. Cherry-picked from 5.15: d45eef3 Change-Id: If55bf0d8d1618e943f0543dafaed0f4f08c94242 Reviewed-by: Robert Griebl <robert.griebl@qt.io> (cherry picked from commit e7aae3561f7b8c060dff2027a1a049e86ae78ad2) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/common-lib/logging.cpp9
-rw-r--r--src/common-lib/logging.h2
2 files changed, 9 insertions, 2 deletions
diff --git a/src/common-lib/logging.cpp b/src/common-lib/logging.cpp
index 91cc09f3..92b7b2ff 100644
--- a/src/common-lib/logging.cpp
+++ b/src/common-lib/logging.cpp
@@ -40,6 +40,7 @@
#include <QThreadStorage>
#include <QAtomicInteger>
#include <QCoreApplication>
+#include <QMutexLocker>
#include "global.h"
#include "logging.h"
@@ -191,6 +192,7 @@ QStringList Logging::s_rules;
QtMessageHandler Logging::s_defaultQtHandler = nullptr;
QByteArray Logging::s_applicationId = QByteArray();
QVariant Logging::s_useAMConsoleLoggerConfig = QVariant();
+QMutex Logging::s_deferredMessagesMutex;
static std::vector<DeferredMessage> s_deferredMessages;
@@ -379,6 +381,7 @@ void Logging::messageHandler(QtMsgType msgType, const QMessageLogContext &contex
void Logging::deferredMessageHandler(QtMsgType msgType, const QMessageLogContext &context, const QString &message)
{
+ QMutexLocker lock(&s_deferredMessagesMutex);
s_deferredMessages.emplace_back(msgType, context, message);
}
@@ -449,6 +452,9 @@ void Logging::useAMConsoleLogger(const QVariant &config)
void Logging::completeSetup()
{
+ qInstallMessageHandler(messageHandler);
+
+ QMutexLocker lock(&s_deferredMessagesMutex);
for (const DeferredMessage &msg : s_deferredMessages) {
QLoggingCategory cat(msg.category);
if (cat.isEnabled(msg.msgType)) {
@@ -456,9 +462,7 @@ void Logging::completeSetup()
messageHandler(msg.msgType, context, msg.message);
}
}
-
std::vector<DeferredMessage>().swap(s_deferredMessages);
- qInstallMessageHandler(messageHandler);
}
QByteArray Logging::applicationId()
@@ -473,6 +477,7 @@ void Logging::setApplicationId(const QByteArray &appId)
bool Logging::deferredMessages()
{
+ QMutexLocker lock(&s_deferredMessagesMutex);
return !s_deferredMessages.empty();
}
diff --git a/src/common-lib/logging.h b/src/common-lib/logging.h
index 094d388a..3090875d 100644
--- a/src/common-lib/logging.h
+++ b/src/common-lib/logging.h
@@ -33,6 +33,7 @@
#include <QtAppManCommon/global.h>
#include <QLoggingCategory>
+#include <QMutex>
QT_BEGIN_NAMESPACE_AM
@@ -85,6 +86,7 @@ private:
static QtMessageHandler s_defaultQtHandler;
static QByteArray s_applicationId;
static QVariant s_useAMConsoleLoggerConfig;
+ static QMutex s_deferredMessagesMutex;
};
void am_trace(QDebug);