diff options
author | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2015-07-13 16:38:25 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2015-07-30 14:55:19 +0000 |
commit | 6557b7118897347ccf7c5915c169cf86c818be83 (patch) | |
tree | e7e67d77b5255222edbd620bd6ae77ec50052ee4 /src/qml/debugger | |
parent | 52e782bdc56fb3a62b045f2d1ca71f38bc7ef796 (diff) |
Make QQmlDebugService::registerService() private and part of ctor
By forcing all debug services to register before the thread starts we
can get rid of the complicated thread synchronization and have a more
natural API for the services.
We can also better enforce the thread situation when registering
services in QQmlDebugServer now. QQmlProfilerService should not
moveToThread() in its constructor as the thread has not been started,
yet. The thread affinity of QQmlProfilerService doesn't make any
difference anyway, as all relevant methods are protected by mutexes
and it doesn't have any slots.
Change-Id: I57db9e2bf94ec6884ede694715dadf5bfd687334
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/qml/debugger')
-rw-r--r-- | src/qml/debugger/qdebugmessageservice.cpp | 1 | ||||
-rw-r--r-- | src/qml/debugger/qqmlconfigurabledebugservice.cpp | 2 | ||||
-rw-r--r-- | src/qml/debugger/qqmldebugserver.cpp | 17 | ||||
-rw-r--r-- | src/qml/debugger/qqmldebugservice.cpp | 15 | ||||
-rw-r--r-- | src/qml/debugger/qqmlenginecontrolservice.cpp | 2 | ||||
-rw-r--r-- | src/qml/debugger/qqmlenginedebugservice.cpp | 2 | ||||
-rw-r--r-- | src/qml/debugger/qqmlinspectorservice.cpp | 1 | ||||
-rw-r--r-- | src/qml/debugger/qqmlprofilerservice.cpp | 5 |
8 files changed, 22 insertions, 23 deletions
diff --git a/src/qml/debugger/qdebugmessageservice.cpp b/src/qml/debugger/qdebugmessageservice.cpp index 9d5d5d0d9c..4483cf1573 100644 --- a/src/qml/debugger/qdebugmessageservice.cpp +++ b/src/qml/debugger/qdebugmessageservice.cpp @@ -67,7 +67,6 @@ QDebugMessageService::QDebugMessageService(QObject *parent) : // don't execute stateChanged() in parallel QMutexLocker lock(&d->initMutex); - registerService(); if (state() == Enabled) { d->oldMsgHandler = qInstallMessageHandler(DebugMessageHandler); d->prevState = Enabled; diff --git a/src/qml/debugger/qqmlconfigurabledebugservice.cpp b/src/qml/debugger/qqmlconfigurabledebugservice.cpp index aa5e69b63d..9382cea42e 100644 --- a/src/qml/debugger/qqmlconfigurabledebugservice.cpp +++ b/src/qml/debugger/qqmlconfigurabledebugservice.cpp @@ -41,7 +41,6 @@ QQmlConfigurableDebugService::QQmlConfigurableDebugService(const QString &name, QObject *parent) : QQmlDebugService((*new QQmlConfigurableDebugServicePrivate(name, version)), parent) { - registerService(); init(); } @@ -49,7 +48,6 @@ QQmlConfigurableDebugService::QQmlConfigurableDebugService(QQmlDebugServicePriva QObject *parent) : QQmlDebugService(dd, parent) { - registerService(); init(); } diff --git a/src/qml/debugger/qqmldebugserver.cpp b/src/qml/debugger/qqmldebugserver.cpp index 4974bce8d8..da2eac79ed 100644 --- a/src/qml/debugger/qqmldebugserver.cpp +++ b/src/qml/debugger/qqmldebugserver.cpp @@ -701,6 +701,9 @@ QQmlDebugService *QQmlDebugServerImpl::service(const QString &name) const void QQmlDebugServerImpl::addEngine(QQmlEngine *engine) { + // to be executed outside of debugger thread + Q_ASSERT(QThread::currentThread() != m_thread); + QWriteLocker lock(&m_pluginsLock); foreach (QQmlDebugService *service, m_plugins) @@ -714,6 +717,9 @@ void QQmlDebugServerImpl::addEngine(QQmlEngine *engine) void QQmlDebugServerImpl::removeEngine(QQmlEngine *engine) { + // to be executed outside of debugger thread + Q_ASSERT(QThread::currentThread() != m_thread); + QWriteLocker lock(&m_pluginsLock); foreach (QQmlDebugService *service, m_plugins) @@ -727,8 +733,8 @@ void QQmlDebugServerImpl::removeEngine(QQmlEngine *engine) bool QQmlDebugServerImpl::addService(QQmlDebugService *service) { - // to be executed outside of debugger thread - Q_ASSERT(!m_thread || QThread::currentThread() != thread()); + // to be executed before thread starts + Q_ASSERT(!m_thread); connect(service, SIGNAL(attachedToEngine(QQmlEngine*)), this, SLOT(wakeEngine(QQmlEngine*)), Qt::QueuedConnection); @@ -750,8 +756,8 @@ bool QQmlDebugServerImpl::addService(QQmlDebugService *service) bool QQmlDebugServerImpl::removeService(QQmlDebugService *service) { - // to be executed outside of debugger thread - Q_ASSERT(!m_thread || QThread::currentThread() != thread()); + // to be executed after thread ends + Q_ASSERT(!m_thread); QWriteLocker lock(&m_pluginsLock); QQmlDebugService::State newState = QQmlDebugService::NotConnected; @@ -816,9 +822,6 @@ void QQmlDebugServerImpl::wakeEngine(QQmlEngine *engine) bool QQmlDebugServerImpl::EngineCondition::waitForServices(QReadWriteLock *locked, int num) { - // to be executed outside of debugger thread - Q_ASSERT(QThread::currentThread() != QQmlDebugServer::instance()->thread()); - Q_ASSERT_X(numServices == 0, Q_FUNC_INFO, "Request to wait again before previous wait finished"); numServices = num; return numServices > 0 ? condition->wait(locked) : true; diff --git a/src/qml/debugger/qqmldebugservice.cpp b/src/qml/debugger/qqmldebugservice.cpp index a406d99fff..44f42af5e4 100644 --- a/src/qml/debugger/qqmldebugservice.cpp +++ b/src/qml/debugger/qqmldebugservice.cpp @@ -51,12 +51,13 @@ QQmlDebugServicePrivate::QQmlDebugServicePrivate(const QString &name, float vers QQmlDebugService::QQmlDebugService(const QString &name, float version, QObject *parent) : QObject(*(new QQmlDebugServicePrivate(name, version)), parent) { - QQmlDebugConnector::instance(); // create it when it isn't there yet. + registerService(); } QQmlDebugService::QQmlDebugService(QQmlDebugServicePrivate &dd, QObject *parent) : QObject(dd, parent) { + registerService(); } /** @@ -81,8 +82,16 @@ QQmlDebugService::State QQmlDebugService::registerService() QQmlDebugService::~QQmlDebugService() { - if (QQmlDebugConnector *inst = QQmlDebugConnector::instance()) - inst->removeService(this); + Q_D(QQmlDebugService); + QQmlDebugConnector *server = QQmlDebugConnector::instance(); + + if (!server) + return; + + if (server->service(d->name) != this) + qWarning() << "QQmlDebugService: Plugin" << d->name << "is not registered."; + else + server->removeService(this); } const QString &QQmlDebugService::name() const diff --git a/src/qml/debugger/qqmlenginecontrolservice.cpp b/src/qml/debugger/qqmlenginecontrolservice.cpp index 07c6715524..ed3fc9e1de 100644 --- a/src/qml/debugger/qqmlenginecontrolservice.cpp +++ b/src/qml/debugger/qqmlenginecontrolservice.cpp @@ -42,8 +42,6 @@ Q_GLOBAL_STATIC(QQmlEngineControlService, qmlEngineControlService) QQmlEngineControlService::QQmlEngineControlService() : QQmlDebugService(QStringLiteral("EngineControl"), 1) { - QMutexLocker lock(&dataMutex); - registerService(); } QQmlEngineControlService *QQmlEngineControlService::instance() diff --git a/src/qml/debugger/qqmlenginedebugservice.cpp b/src/qml/debugger/qqmlenginedebugservice.cpp index ac49d99f09..ad8f4fb15a 100644 --- a/src/qml/debugger/qqmlenginedebugservice.cpp +++ b/src/qml/debugger/qqmlenginedebugservice.cpp @@ -67,8 +67,6 @@ QQmlEngineDebugService::QQmlEngineDebugService(QObject *parent) { QObject::connect(m_watch, SIGNAL(propertyChanged(int,int,QMetaProperty,QVariant)), this, SLOT(propertyChanged(int,int,QMetaProperty,QVariant))); - - registerService(); } QQmlEngineDebugService::~QQmlEngineDebugService() diff --git a/src/qml/debugger/qqmlinspectorservice.cpp b/src/qml/debugger/qqmlinspectorservice.cpp index 7cd8b796ec..e3c7ad7d55 100644 --- a/src/qml/debugger/qqmlinspectorservice.cpp +++ b/src/qml/debugger/qqmlinspectorservice.cpp @@ -54,7 +54,6 @@ QQmlInspectorService::QQmlInspectorService() : QQmlDebugService(QStringLiteral("QmlInspector"), 1) , m_currentInspectorPlugin(0) { - registerService(); } QQmlInspectorService *QQmlInspectorService::instance() diff --git a/src/qml/debugger/qqmlprofilerservice.cpp b/src/qml/debugger/qqmlprofilerservice.cpp index 4062f2f33c..e48771090e 100644 --- a/src/qml/debugger/qqmlprofilerservice.cpp +++ b/src/qml/debugger/qqmlprofilerservice.cpp @@ -51,11 +51,6 @@ QQmlProfilerService::QQmlProfilerService() : QQmlConfigurableDebugService(QStringLiteral("CanvasFrameRate"), 1) { m_timer.start(); - - QMutexLocker lock(configMutex()); - // If there is no debug server it doesn't matter as we'll never get enabled anyway. - if (QQmlDebugConnector::instance() != 0) - moveToThread(QQmlDebugConnector::instance()->thread()); } QQmlProfilerService::~QQmlProfilerService() |