summaryrefslogtreecommitdiff
path: root/src/declarative/debugger/qv8profilerservice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/debugger/qv8profilerservice.cpp')
-rw-r--r--src/declarative/debugger/qv8profilerservice.cpp287
1 files changed, 0 insertions, 287 deletions
diff --git a/src/declarative/debugger/qv8profilerservice.cpp b/src/declarative/debugger/qv8profilerservice.cpp
deleted file mode 100644
index 5ae2d01cc2..0000000000
--- a/src/declarative/debugger/qv8profilerservice.cpp
+++ /dev/null
@@ -1,287 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qv8profilerservice_p.h"
-#include "qdeclarativedebugservice_p_p.h"
-#include "private/qjsconverter_impl_p.h"
-#include <private/qv8profiler_p.h>
-
-#include <QtCore/QHash>
-
-QT_BEGIN_NAMESPACE
-
-Q_GLOBAL_STATIC(QV8ProfilerService, v8ProfilerInstance)
-
-class DebugServiceOutputStream : public v8::OutputStream
-{
- QDeclarativeDebugService &_service;
-public:
- DebugServiceOutputStream(QDeclarativeDebugService &service)
- : v8::OutputStream(),
- _service(service) {}
- void EndOfStream() {}
- WriteResult WriteAsciiChunk(char *rawData, int size)
- {
- QByteArray data;
- QDataStream ds(&data, QIODevice::WriteOnly);
- ds << QV8ProfilerService::V8SnapshotChunk << QByteArray(rawData, size);
- _service.sendMessage(data);
- return kContinue;
- }
-};
-
-// convert to a QByteArray that can be sent to the debug client
-QByteArray QV8ProfilerData::toByteArray() const
-{
- QByteArray data;
- //### using QDataStream is relatively expensive
- QDataStream ds(&data, QIODevice::WriteOnly);
- ds << messageType << filename << functionname << lineNumber << totalTime << selfTime << treeLevel;
-
- return data;
-}
-
-class QV8ProfilerServicePrivate : public QDeclarativeDebugServicePrivate
-{
- Q_DECLARE_PUBLIC(QV8ProfilerService)
-
-public:
- QV8ProfilerServicePrivate()
- :initialized(false)
- {
- }
-
- void takeSnapshot(v8::HeapSnapshot::Type);
-
- void printProfileTree(const v8::CpuProfileNode *node, int level = 0);
- void sendMessages();
-
- QList<QV8ProfilerData> m_data;
-
- bool initialized;
- QList<QString> m_ongoing;
-};
-
-QV8ProfilerService::QV8ProfilerService(QObject *parent)
- : QDeclarativeDebugService(*(new QV8ProfilerServicePrivate()), QLatin1String("V8Profiler"), 1, parent)
-{
- Q_D(QV8ProfilerService);
-
- if (registerService() == Enabled) {
- // ,block mode, client attached
- while (!d->initialized)
- waitForMessage();
- }
-}
-
-QV8ProfilerService::~QV8ProfilerService()
-{
-}
-
-QV8ProfilerService *QV8ProfilerService::instance()
-{
- return v8ProfilerInstance();
-}
-
-void QV8ProfilerService::initialize()
-{
- // just make sure that the service is properly registered
- v8ProfilerInstance();
-}
-
-void QV8ProfilerService::stateAboutToBeChanged(QDeclarativeDebugService::State newState)
-{
- Q_D(QV8ProfilerService);
-
- if (state() == newState)
- return;
-
- if (state() == 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);
-
- QDataStream ds(message);
- QByteArray command;
- QByteArray option;
- QByteArray title;
- ds >> command >> option;
-
- if (command == "V8PROFILER") {
- ds >> 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->initialized = true;
- }
-
- if (command == "V8SNAPSHOT") {
- if (option == "full")
- QMetaObject::invokeMethod(this, "takeSnapshot", Qt::QueuedConnection);
- else if (option == "delete") {
- QMetaObject::invokeMethod(this, "deleteSnapshots", Qt::QueuedConnection);
- }
- }
-
- QDeclarativeDebugService::messageReceived(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);
-
- d->m_ongoing.append(title);
-}
-
-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);
- if (cpuProfile) {
- // can happen at start
- const v8::CpuProfileNode *rootNode = cpuProfile->GetTopDownRoot();
- d->printProfileTree(rootNode);
- }
-}
-
-void QV8ProfilerService::takeSnapshot()
-{
- Q_D(QV8ProfilerService);
- d->takeSnapshot(v8::HeapSnapshot::kFull);
-}
-
-void QV8ProfilerService::deleteSnapshots()
-{
- v8::HeapProfiler::DeleteAllSnapshots();
-}
-
-void QV8ProfilerService::sendProfilingData()
-{
- Q_D(QV8ProfilerService);
- // Send messages to client
- d->sendMessages();
-}
-
-void QV8ProfilerServicePrivate::printProfileTree(const v8::CpuProfileNode *node, int level)
-{
- for (int index = 0 ; index < node->GetChildrenCount() ; index++) {
- const v8::CpuProfileNode* childNode = node->GetChild(index);
- QString scriptResourceName = QJSConverter::toString(childNode->GetScriptResourceName());
- if (scriptResourceName.length() > 0) {
-
- QV8ProfilerData rd = {(int)QV8ProfilerService::V8Entry, scriptResourceName,
- QJSConverter::toString(childNode->GetFunctionName()),
- childNode->GetLineNumber(), childNode->GetTotalTime(), childNode->GetSelfTime(), level};
- m_data.append(rd);
-
- // different nodes might have common children: fix at client side
- if (childNode->GetChildrenCount() > 0) {
- printProfileTree(childNode, level+1);
- }
- }
- }
-}
-
-void QV8ProfilerServicePrivate::takeSnapshot(v8::HeapSnapshot::Type snapshotType)
-{
- Q_Q(QV8ProfilerService);
-
- v8::HandleScope scope;
- v8::Local<v8::String> title = v8::String::New("");
-
- DebugServiceOutputStream outputStream(*q);
- const v8::HeapSnapshot *snapshot = v8::HeapProfiler::TakeSnapshot(title, snapshotType);
- snapshot->Serialize(&outputStream, v8::HeapSnapshot::kJSON);
-
- //indicate completion
- QByteArray data;
- QDataStream ds(&data, QIODevice::WriteOnly);
- ds << (int)QV8ProfilerService::V8SnapshotComplete;
-
- q->sendMessage(data);
-}
-
-void QV8ProfilerServicePrivate::sendMessages()
-{
- Q_Q(QV8ProfilerService);
-
- QList<QByteArray> messages;
- for (int i = 0; i < m_data.count(); ++i)
- messages << m_data.at(i).toByteArray();
- q->sendMessages(messages);
- m_data.clear();
-
- //indicate completion
- QByteArray data;
- QDataStream ds(&data, QIODevice::WriteOnly);
- ds << (int)QV8ProfilerService::V8Complete;
-
- q->sendMessage(data);
-}
-
-
-QT_END_NAMESPACE