diff options
| author | Kai Koehne <kai.koehne@nokia.com> | 2012-04-24 14:39:38 +0200 |
|---|---|---|
| committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-25 14:26:42 +0200 |
| commit | 0d284ae2d62707e6c35c8d97ca73e974d35c4167 (patch) | |
| tree | d41e0e0c64486a43c45db2c6a8ad3e1a9fba6ec9 /src/qml/debugger/qdebugmessageservice.cpp | |
| parent | e1583664fd8a9eb66e37bdd2e1476bbf90383a4c (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.cpp | 6 |
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; |
