summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Weimer <bernd.weimer@qt.io>2021-03-19 16:10:59 +0100
committerBernd Weimer <bernd.weimer@qt.io>2021-03-29 16:12:02 +0100
commitd45eef3ddf7a2cd4825704e180b230d4289d140d (patch)
tree789d8635db65643bc95f2d11ce1fcc541c174811
parentc9e1297da4ed3c7960f989b9078a3164a67ecc71 (diff)
downloadqtapplicationmanager-d45eef3ddf7a2cd4825704e180b230d4289d140d.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. Change-Id: I827c240a92bfe0096783c2de0ebb59914cea9133 Reviewed-by: Robert Griebl <robert.griebl@qt.io>
-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 94b9719b..3c9e08c6 100644
--- a/src/common-lib/logging.cpp
+++ b/src/common-lib/logging.cpp
@@ -52,6 +52,7 @@
#include <QThreadStorage>
#include <QAtomicInteger>
#include <QCoreApplication>
+#include <QMutexLocker>
#include "global.h"
#include "logging.h"
@@ -208,6 +209,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;
@@ -396,6 +398,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);
}
@@ -466,6 +469,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)) {
@@ -473,9 +479,7 @@ void Logging::completeSetup()
messageHandler(msg.msgType, context, msg.message);
}
}
-
std::vector<DeferredMessage>().swap(s_deferredMessages);
- qInstallMessageHandler(messageHandler);
}
QByteArray Logging::applicationId()
@@ -490,6 +494,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 d696c078..99231e7a 100644
--- a/src/common-lib/logging.h
+++ b/src/common-lib/logging.h
@@ -45,6 +45,7 @@
#include <QtAppManCommon/global.h>
#include <QLoggingCategory>
+#include <QMutex>
QT_BEGIN_NAMESPACE_AM
@@ -98,6 +99,7 @@ private:
static QtMessageHandler s_defaultQtHandler;
static QByteArray s_applicationId;
static QVariant s_useAMConsoleLoggerConfig;
+ static QMutex s_deferredMessagesMutex;
};
void am_trace(QDebug);