aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/debugger
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/debugger')
-rw-r--r--src/declarative/debugger/qdeclarativedebugserver.cpp11
-rw-r--r--src/declarative/debugger/qdeclarativedebugservice.cpp4
-rw-r--r--src/declarative/debugger/qdeclarativedebugservice_p.h1
-rw-r--r--src/declarative/debugger/qdeclarativedebugtrace.cpp17
-rw-r--r--src/declarative/debugger/qdeclarativedebugtrace_p.h3
-rw-r--r--src/declarative/debugger/qv8profilerservice.cpp39
-rw-r--r--src/declarative/debugger/qv8profilerservice_p.h1
7 files changed, 61 insertions, 15 deletions
diff --git a/src/declarative/debugger/qdeclarativedebugserver.cpp b/src/declarative/debugger/qdeclarativedebugserver.cpp
index ec0a6a56b2..d4c203f1f7 100644
--- a/src/declarative/debugger/qdeclarativedebugserver.cpp
+++ b/src/declarative/debugger/qdeclarativedebugserver.cpp
@@ -221,6 +221,10 @@ void QDeclarativeDebugServerThread::run()
}
exec();
+
+ // make sure events still waiting are processed
+ QEventLoop eventLoop;
+ eventLoop.processEvents(QEventLoop::AllEvents);
}
bool QDeclarativeDebugServer::hasDebuggingClient() const
@@ -325,6 +329,7 @@ QDeclarativeDebugServer::~QDeclarativeDebugServer()
QReadLocker(&d->pluginsLock);
{
foreach (QDeclarativeDebugService *service, d->plugins.values()) {
+ service->statusAboutToBeChanged(QDeclarativeDebugService::NotConnected);
service->d_func()->server = 0;
service->d_func()->status = QDeclarativeDebugService::NotConnected;
service->statusChanged(QDeclarativeDebugService::NotConnected);
@@ -333,8 +338,7 @@ QDeclarativeDebugServer::~QDeclarativeDebugServer()
if (d->thread) {
d->thread->exit();
- if (!d->thread->wait(1000))
- d->thread->terminate();
+ d->thread->wait();
delete d->thread;
}
delete d->connection;
@@ -487,8 +491,9 @@ bool QDeclarativeDebugServer::removeService(QDeclarativeDebugService *service)
}
{
QReadLocker(&d->pluginsLock);
- d->advertisePlugins();
QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::NotConnected;
+ service->statusAboutToBeChanged(newStatus);
+ d->advertisePlugins();
service->d_func()->server = 0;
service->d_func()->status = newStatus;
service->statusChanged(newStatus);
diff --git a/src/declarative/debugger/qdeclarativedebugservice.cpp b/src/declarative/debugger/qdeclarativedebugservice.cpp
index 009d217cf3..98d95d7b34 100644
--- a/src/declarative/debugger/qdeclarativedebugservice.cpp
+++ b/src/declarative/debugger/qdeclarativedebugservice.cpp
@@ -253,6 +253,10 @@ bool QDeclarativeDebugService::waitForMessage()
return d->server->waitForMessage(this);
}
+void QDeclarativeDebugService::statusAboutToBeChanged(Status)
+{
+}
+
void QDeclarativeDebugService::statusChanged(Status)
{
}
diff --git a/src/declarative/debugger/qdeclarativedebugservice_p.h b/src/declarative/debugger/qdeclarativedebugservice_p.h
index 1223b948c1..7cce2ba86b 100644
--- a/src/declarative/debugger/qdeclarativedebugservice_p.h
+++ b/src/declarative/debugger/qdeclarativedebugservice_p.h
@@ -96,6 +96,7 @@ protected:
Status registerService();
+ virtual void statusAboutToBeChanged(Status);
virtual void statusChanged(Status);
virtual void messageReceived(const QByteArray &);
diff --git a/src/declarative/debugger/qdeclarativedebugtrace.cpp b/src/declarative/debugger/qdeclarativedebugtrace.cpp
index dc4a91920e..5f8a61cc3b 100644
--- a/src/declarative/debugger/qdeclarativedebugtrace.cpp
+++ b/src/declarative/debugger/qdeclarativedebugtrace.cpp
@@ -299,14 +299,27 @@ void QDeclarativeDebugTrace::sendMessages()
QList<QByteArray> messages;
for (int i = 0; i < m_data.count(); ++i)
messages << m_data.at(i).toByteArray();
- QDeclarativeDebugService::sendMessages(messages);
m_data.clear();
//indicate completion
QByteArray data;
QDataStream ds(&data, QIODevice::WriteOnly);
ds << (qint64)-1 << (int)Complete;
- sendMessage(data);
+ messages << data;
+
+ QDeclarativeDebugService::sendMessages(messages);
+}
+
+void QDeclarativeDebugTrace::statusAboutToBeChanged(QDeclarativeDebugService::Status newStatus)
+{
+ if (status() == newStatus)
+ return;
+
+ if (status() == Enabled
+ && m_enabled) {
+ stopProfilingImpl();
+ sendMessages();
+ }
}
void QDeclarativeDebugTrace::messageReceived(const QByteArray &message)
diff --git a/src/declarative/debugger/qdeclarativedebugtrace_p.h b/src/declarative/debugger/qdeclarativedebugtrace_p.h
index e0d04aa067..0701f35617 100644
--- a/src/declarative/debugger/qdeclarativedebugtrace_p.h
+++ b/src/declarative/debugger/qdeclarativedebugtrace_p.h
@@ -100,7 +100,7 @@ public:
RangeData,
RangeLocation,
RangeEnd,
- Complete,
+ Complete, // end of transmission
MaximumMessage
};
@@ -145,6 +145,7 @@ public:
~QDeclarativeDebugTrace();
protected:
+ virtual void statusAboutToBeChanged(Status status);
virtual void messageReceived(const QByteArray &);
private:
diff --git a/src/declarative/debugger/qv8profilerservice.cpp b/src/declarative/debugger/qv8profilerservice.cpp
index 3abec3f6a2..743ee6ec4f 100644
--- a/src/declarative/debugger/qv8profilerservice.cpp
+++ b/src/declarative/debugger/qv8profilerservice.cpp
@@ -97,7 +97,7 @@ public:
QList<QV8ProfilerData> m_data;
bool initialized;
- bool m_enabled;
+ QList<QString> m_ongoing;
};
QV8ProfilerService::QV8ProfilerService(QObject *parent)
@@ -105,8 +105,6 @@ QV8ProfilerService::QV8ProfilerService(QObject *parent)
{
Q_D(QV8ProfilerService);
- d->m_enabled = false;
-
if (registerService() == Enabled) {
// ,block mode, client attached
while (!d->initialized)
@@ -129,6 +127,20 @@ void QV8ProfilerService::initialize()
v8ProfilerInstance();
}
+void QV8ProfilerService::statusAboutToBeChanged(QDeclarativeDebugService::Status newStatus)
+{
+ Q_D(QV8ProfilerService);
+
+ if (status() == newStatus)
+ return;
+
+ if (status() == Enabled) {
+ foreach (const QString &title, d->m_ongoing)
+ QMetaObject::invokeMethod(this, "stopProfiling", Qt::QueuedConnection, Q_ARG(QString, title));
+ sendProfilingData();
+ }
+}
+
void QV8ProfilerService::messageReceived(const QByteArray &message)
{
Q_D(QV8ProfilerService);
@@ -141,13 +153,12 @@ void QV8ProfilerService::messageReceived(const QByteArray &message)
if (command == "V8PROFILER") {
ds >> title;
- if (option == "start" && !d->m_enabled) {
- QMetaObject::invokeMethod(this, "startProfiling", Qt::QueuedConnection, Q_ARG(QString, QString::fromUtf8(title)));
- d->m_enabled = true;
- } else if (option == "stop" && d->m_enabled) {
- QMetaObject::invokeMethod(this, "stopProfiling", Qt::QueuedConnection, Q_ARG(QString, QString::fromUtf8(title)));
+ QString titleStr = QString::fromUtf8(title);
+ if (option == "start") {
+ QMetaObject::invokeMethod(this, "startProfiling", Qt::QueuedConnection, Q_ARG(QString, titleStr));
+ } else if (option == "stop" && d->initialized) {
+ QMetaObject::invokeMethod(this, "stopProfiling", Qt::QueuedConnection, Q_ARG(QString, titleStr));
QMetaObject::invokeMethod(this, "sendProfilingData", Qt::QueuedConnection);
- d->m_enabled = false;
}
d->initialized = true;
}
@@ -165,7 +176,12 @@ void QV8ProfilerService::messageReceived(const QByteArray &message)
void QV8ProfilerService::startProfiling(const QString &title)
{
+ Q_D(QV8ProfilerService);
// Start Profiling
+
+ if (d->m_ongoing.contains(title))
+ return;
+
v8::HandleScope handle_scope;
v8::Handle<v8::String> v8title = v8::String::New(reinterpret_cast<const uint16_t*>(title.data()), title.size());
v8::CpuProfiler::StartProfiling(v8title);
@@ -175,6 +191,11 @@ void QV8ProfilerService::stopProfiling(const QString &title)
{
Q_D(QV8ProfilerService);
// Stop profiling
+
+ if (!d->m_ongoing.contains(title))
+ return;
+ d->m_ongoing.removeOne(title);
+
v8::HandleScope handle_scope;
v8::Handle<v8::String> v8title = v8::String::New(reinterpret_cast<const uint16_t*>(title.data()), title.size());
const v8::CpuProfile *cpuProfile = v8::CpuProfiler::StopProfiling(v8title);
diff --git a/src/declarative/debugger/qv8profilerservice_p.h b/src/declarative/debugger/qv8profilerservice_p.h
index ef126a00e3..75589ad839 100644
--- a/src/declarative/debugger/qv8profilerservice_p.h
+++ b/src/declarative/debugger/qv8profilerservice_p.h
@@ -104,6 +104,7 @@ public slots:
void sendProfilingData();
protected:
+ void statusAboutToBeChanged(Status status);
void messageReceived(const QByteArray &);
private: