aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/debugger/qdebugmessageservice.cpp
diff options
context:
space:
mode:
authorKai Koehne <kai.koehne@nokia.com>2012-04-24 14:39:38 +0200
committerQt by Nokia <qt-info@nokia.com>2012-04-25 14:26:42 +0200
commit0d284ae2d62707e6c35c8d97ca73e974d35c4167 (patch)
treed41e0e0c64486a43c45db2c6a8ad3e1a9fba6ec9 /src/qml/debugger/qdebugmessageservice.cpp
parente1583664fd8a9eb66e37bdd2e1476bbf90383a4c (diff)
Debugger: Fix race conditions in block mode
Using waitForMessage() in the constructor after registerService() is _not_ safe: You might get the first message already after the registerService() and before the waitForMessage() call. Instead, use QMutex/QWaitCondition to block the initialization. Also make the use of the block mode explicit, since the service might already be enabled also for non-blocking modes ... Change-Id: I387bfe0627c80e2029acff71f86d12cd9ab58de1 Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
Diffstat (limited to 'src/qml/debugger/qdebugmessageservice.cpp')
-rw-r--r--src/qml/debugger/qdebugmessageservice.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/qml/debugger/qdebugmessageservice.cpp b/src/qml/debugger/qdebugmessageservice.cpp
index a41f95c2c7..bcd798517c 100644
--- a/src/qml/debugger/qdebugmessageservice.cpp
+++ b/src/qml/debugger/qdebugmessageservice.cpp
@@ -43,6 +43,7 @@
#include "qqmldebugservice_p_p.h"
#include <QDataStream>
+#include <QMutex>
QT_BEGIN_NAMESPACE
@@ -65,6 +66,7 @@ public:
QMessageHandler oldMsgHandler;
QQmlDebugService::State prevState;
+ QMutex initMutex;
};
QDebugMessageService::QDebugMessageService(QObject *parent) :
@@ -73,6 +75,8 @@ QDebugMessageService::QDebugMessageService(QObject *parent) :
{
Q_D(QDebugMessageService);
+ // don't execute stateChanged() in parallel
+ QMutexLocker lock(&d->initMutex);
registerService();
if (state() == Enabled) {
d->oldMsgHandler = qInstallMessageHandler(DebugMessageHandler);
@@ -108,6 +112,7 @@ void QDebugMessageService::sendDebugMessage(QtMsgType type,
void QDebugMessageService::stateChanged(State state)
{
Q_D(QDebugMessageService);
+ QMutexLocker lock(&d->initMutex);
if (state != Enabled && d->prevState == Enabled) {
QMessageHandler handler = qInstallMessageHandler(d->oldMsgHandler);
@@ -117,7 +122,6 @@ void QDebugMessageService::stateChanged(State state)
} else if (state == Enabled && d->prevState != Enabled) {
d->oldMsgHandler = qInstallMessageHandler(DebugMessageHandler);
-
}
d->prevState = state;