Navigation Menu

Skip to content

Commit

Permalink
Debugger: Fix livelock on exit (Windows)
Browse files Browse the repository at this point in the history
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: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Reviewed-by: Aurindam Jana <aurindam.jana@nokia.com>
  • Loading branch information
Kai Koehne authored and Qt by Nokia committed Dec 20, 2011
1 parent d009638 commit 83c5b4c
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 14 deletions.
44 changes: 30 additions & 14 deletions src/declarative/debugger/qdeclarativedebugserver.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions src/declarative/debugger/qdeclarativedebugserver_p.h
Expand Up @@ -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);
Expand Down

0 comments on commit 83c5b4c

Please sign in to comment.