Commit 83c5b4c1 authored by Kai Koehne's avatar Kai Koehne Committed by Qt by Nokia
Browse files

Debugger: Fix livelock on exit (Windows)


We used to close the debugger thread when the last service was killed: This happened
in the unloading of static global variables. Apparently this is too late on Windows,
since the OS thread associated was already terminated.

Instead, we now kill the instance when the QCoreApplication event loop is exiting.

Change-Id: I12a46ab9e7ac64561c94c0cd0d88b78fbaf8554c
Reviewed-by: default avatarFriedemann Kleint <Friedemann.Kleint@nokia.com>
Reviewed-by: default avatarAurindam Jana <aurindam.jana@nokia.com>
parent d0096381
Branches
Tags
No related merge requests found
Showing with 32 additions and 14 deletions
......@@ -231,6 +231,13 @@ bool QDeclarativeDebugServer::hasDebuggingClient() const
static QDeclarativeDebugServer *qDeclarativeDebugServer = 0;
static void cleanup()
{
delete qDeclarativeDebugServer;
qDeclarativeDebugServer = 0;
}
QDeclarativeDebugServer *QDeclarativeDebugServer::instance()
{
static bool commandLineTested = false;
......@@ -269,10 +276,7 @@ QDeclarativeDebugServer *QDeclarativeDebugServer::instance()
if (ok) {
qDeclarativeDebugServer = new QDeclarativeDebugServer();
QDeclarativeDebugServerThread *thread = new QDeclarativeDebugServerThread;
qDeclarativeDebugServer = new QDeclarativeDebugServer();
qDeclarativeDebugServer->d_func()->thread = thread;
qDeclarativeDebugServer->moveToThread(thread);
thread->setPluginName(pluginName);
......@@ -309,6 +313,29 @@ QDeclarativeDebugServer *QDeclarativeDebugServer::instance()
QDeclarativeDebugServer::QDeclarativeDebugServer()
: QObject(*(new QDeclarativeDebugServerPrivate))
{
qAddPostRoutine(cleanup);
}
QDeclarativeDebugServer::~QDeclarativeDebugServer()
{
Q_D(QDeclarativeDebugServer);
QReadLocker(&d->pluginsLock);
{
foreach (QDeclarativeDebugService *service, d->plugins.values()) {
service->d_func()->server = 0;
service->d_func()->status = QDeclarativeDebugService::NotConnected;
service->statusChanged(QDeclarativeDebugService::NotConnected);
}
}
if (d->thread) {
d->thread->exit();
if (!d->thread->wait(1000))
d->thread->terminate();
delete d->thread;
}
delete d->connection;
}
void QDeclarativeDebugServer::receiveMessage(const QByteArray &message)
......@@ -463,17 +490,6 @@ bool QDeclarativeDebugServer::removeService(QDeclarativeDebugService *service)
service->d_func()->server = 0;
service->d_func()->status = newStatus;
service->statusChanged(newStatus);
// Last service? Then stop thread & delete instance
if (d->plugins.isEmpty()) {
d->thread->exit();
d->thread->wait();
delete d->thread;
delete d->connection;
qDeclarativeDebugServer = 0;
deleteLater();
}
}
return true;
......
......@@ -71,6 +71,8 @@ class Q_DECLARATIVE_EXPORT QDeclarativeDebugServer : public QObject
Q_DECLARE_PRIVATE(QDeclarativeDebugServer)
Q_DISABLE_COPY(QDeclarativeDebugServer)
public:
~QDeclarativeDebugServer();
static QDeclarativeDebugServer *instance();
void setConnection(QDeclarativeDebugServerConnection *connection);
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment