diff options
Diffstat (limited to 'src/declarative/debugger')
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: |