aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/debugger/qqmlprofilerservice_p.h
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@digia.com>2014-01-24 12:44:49 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-15 22:37:48 +0100
commit72420889aa54342da4472683e67e2c70b76a170f (patch)
tree3bbbb3a3f7b3286cb40f01763c42886bfd265500 /src/qml/debugger/qqmlprofilerservice_p.h
parent9424383e6d0ea1dd02dcf1070259e21550da692a (diff)
Add dedicated QML profiler and adapter
The remaining "profiling" parts of the QML profiler service are engine specific and are best accessed through their own adapter. Change-Id: Idb763104bdd80e4dabdf132ec1a496b9bc9f6f46 Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src/qml/debugger/qqmlprofilerservice_p.h')
-rw-r--r--src/qml/debugger/qqmlprofilerservice_p.h328
1 files changed, 0 insertions, 328 deletions
diff --git a/src/qml/debugger/qqmlprofilerservice_p.h b/src/qml/debugger/qqmlprofilerservice_p.h
index a5d85a76e6..9e05424ce1 100644
--- a/src/qml/debugger/qqmlprofilerservice_p.h
+++ b/src/qml/debugger/qqmlprofilerservice_p.h
@@ -58,7 +58,6 @@
#include "qqmlabstractprofileradapter_p.h"
#include <private/qqmlboundsignal_p.h>
-#include <private/qv4function_p.h>
#include <QtCore/qelapsedtimer.h>
#include <QtCore/qmetaobject.h>
@@ -67,94 +66,8 @@
#include <QtCore/qstringbuilder.h>
#include <QtCore/qwaitcondition.h>
-#define Q_QML_PROFILE_IF_ENABLED(Code)\
- if (QQmlProfilerService::enabled) {\
- Code;\
- } else\
- (void)0
-
-#define Q_QML_PROFILE(Method)\
- Q_QML_PROFILE_IF_ENABLED(QQmlProfilerService::Method)
-
QT_BEGIN_NAMESPACE
-// This struct is somewhat dangerous to use:
-// You can save values either with 32 or 64 bit precision. toByteArrays will
-// guess the precision from messageType. If you state the wrong messageType
-// you will get undefined results.
-// The messageType is itself a bit field. You can pack multiple messages into
-// one object, e.g. RangeStart and RangeLocation. Each one will be read
-// independently by toByteArrays. Thus you can only pack messages if their data
-// doesn't overlap. Again, it's up to you to figure that out.
-struct Q_AUTOTEST_EXPORT QQmlProfilerData
-{
- QQmlProfilerData() {}
-
- QQmlProfilerData(qint64 time, int messageType, int detailType, const QUrl &url,
- int x = 0, int y = 0, int framerate = 0, int count = 0, int bindingType = 0) :
- time(time), messageType(messageType), detailType(detailType), detailUrl(url),
- x(x), y(y), framerate(framerate), count(count), bindingType(bindingType) {}
-
- QQmlProfilerData(qint64 time, int messageType, int detailType, const QString &str,
- int x = 0, int y = 0, int framerate = 0, int count = 0, int bindingType = 0) :
- time(time), messageType(messageType), detailType(detailType),detailString(str),
- x(x), y(y), framerate(framerate), count(count), bindingType(bindingType) {}
-
- QQmlProfilerData(qint64 time, int messageType, int detailType, const QString &str,
- const QUrl &url, int x = 0, int y = 0, int framerate = 0, int count = 0,
- int bindingType = 0) :
- time(time), messageType(messageType), detailType(detailType), detailString(str),
- detailUrl(url), x(x), y(y), framerate(framerate), count(count), bindingType(bindingType) {}
-
-
- QQmlProfilerData(qint64 time, int messageType, int detailType) :
- time(time), messageType(messageType), detailType(detailType) {}
-
- // Special ctor for scenegraph frames. Note that it's missing the QString/QUrl params.
- // This is slightly ugly, but makes it easier to disambiguate between int and qint64 params.
- QQmlProfilerData(qint64 time, int messageType, int detailType,
- qint64 d1, qint64 d2, qint64 d3, qint64 d4, qint64 d5) :
- time(time), messageType(messageType), detailType(detailType),
- subtime_1(d1), subtime_2(d2), subtime_3(d3), subtime_4(d4), subtime_5(d5) {}
-
-
- qint64 time;
- int messageType; //bit field of QQmlProfilerService::Message
- int detailType;
-
- QString detailString; //used by RangeData and possibly by RangeLocation
- QUrl detailUrl; //used by RangeLocation, overrides detailString
-
- union {
- qint64 subtime_1;
- int x; //used by RangeLocation and for pixmaps
- };
-
- union {
- qint64 subtime_2;
- int y; //used by RangeLocation and for pixmaps
- };
-
- union {
- qint64 subtime_3;
- int framerate; //used by animation events
- };
-
- union {
- qint64 subtime_4;
- int count; //used by animation events and for pixmaps
- };
-
- union {
- qint64 subtime_5;
- int bindingType;
- };
-
- void toByteArrays(QList<QByteArray> &messages) const;
-};
-
-Q_DECLARE_TYPEINFO(QQmlProfilerData, Q_MOVABLE_TYPE);
-
class QUrl;
class QQmlEngine;
@@ -176,8 +89,6 @@ public:
void startProfiling(QQmlEngine *engine);
void stopProfiling(QQmlEngine *engine);
- qint64 timestamp() {return m_timer.nsecsElapsed();}
-
QQmlProfilerService();
~QQmlProfilerService();
@@ -189,254 +100,15 @@ protected:
private:
- static void startBinding(const QString &fileName, int line, int column, BindingType bindingType)
- {
- m_instance->processMessage(QQmlProfilerData(m_instance->timestamp(),
- (1 << RangeStart | 1 << RangeLocation),
- 1 << Binding, fileName, line, column, 0, 0,
- bindingType));
- }
-
- // Have toByteArrays() construct another RangeData event from the same QString later.
- // This is somewhat pointless but important for backwards compatibility.
- static void startCompiling(const QString &name)
- {
- m_instance->processMessage(QQmlProfilerData(m_instance->timestamp(),
- (1 << RangeStart | 1 << RangeLocation | 1 << RangeData), 1 << Compiling,
- name, 1, 1, 0, 0, QmlBinding));
- }
-
- static void startHandlingSignal(const QString &fileName, int line, int column)
- {
- m_instance->processMessage(QQmlProfilerData(m_instance->timestamp(),
- (1 << RangeStart | 1 << RangeLocation),
- 1 << HandlingSignal, fileName, line, column, 0, 0,
- QmlBinding));
- }
-
- static void startCreating(const QString &typeName, const QUrl &fileName, int line, int column)
- {
- m_instance->processMessage(QQmlProfilerData(m_instance->timestamp(),
- (1 << RangeStart | 1 << RangeLocation | 1 << RangeData),
- 1 << Creating, typeName, fileName, line, column,
- 0, 0, QmlBinding));
- }
-
- static void startCreating(const QString &typeName)
- {
- m_instance->processMessage(QQmlProfilerData(m_instance->timestamp(),
- (1 << RangeStart | 1 << RangeData), 1 << Creating,
- typeName, 0, 0, 0, 0, QmlBinding));
- }
-
- static void creatingLocation(const QUrl &fileName, int line, int column)
- {
- m_instance->processMessage(QQmlProfilerData(m_instance->timestamp(), 1 << RangeLocation,
- 1 << Creating, fileName, line, column));
- }
-
- template<RangeType Range>
- static void endRange()
- {
- m_instance->processMessage(QQmlProfilerData(m_instance->timestamp(), 1 << RangeEnd,
- 1 << Range));
- }
-
void sendMessages();
void addEngineProfiler(QQmlAbstractProfilerAdapter *profiler, QQmlEngine *engine);
- void processMessage(const QQmlProfilerData &message)
- {
- QMutexLocker locker(&m_dataMutex);
- m_data.append(message);
- }
-
-public:
- static bool enabled;
-private:
QElapsedTimer m_timer;
- QVector<QQmlProfilerData> m_data;
- QMutex m_dataMutex;
QList<QQmlAbstractProfilerAdapter *> m_globalProfilers;
QMultiHash<QQmlEngine *, QQmlAbstractProfilerAdapter *> m_engineProfilers;
QList<QQmlEngine *> m_stoppingEngines;
QMultiMap<qint64, QQmlAbstractProfilerAdapter *> m_startTimes;
-
- static QQmlProfilerService *m_instance;
-
- friend struct QQmlBindingProfiler;
- friend struct QQmlHandlingSignalProfiler;
- friend struct QQmlVmeProfiler;
- friend struct QQmlCompilingProfiler;
- friend class QQmlProfiler;
-};
-
-// Temporary shim around QQmlProfilerService to make it look like a QQmlAbstractProfilerAdapter.
-class QQmlProfiler : public QQmlAbstractProfilerAdapter {
- Q_OBJECT
-public:
- QQmlProfiler(QQmlProfilerService *service);
- qint64 sendMessages(qint64 until, QList<QByteArray> &messages);
-
-public slots:
- void startProfiling();
- void stopProfiling();
-private:
- int next;
-};
-
-//
-// RAII helper structs
-//
-
-struct QQmlBindingProfiler {
- QQmlBindingProfiler(const QString &url, int line, int column, QQmlProfilerService::BindingType bindingType)
- {
- Q_QML_PROFILE(startBinding(url, line, column, bindingType));
- }
-
- ~QQmlBindingProfiler()
- {
- Q_QML_PROFILE(endRange<QQmlProfilerService::Binding>());
- }
-};
-
-struct QQmlHandlingSignalProfiler {
- QQmlHandlingSignalProfiler(QQmlBoundSignalExpression *expression)
- {
- Q_QML_PROFILE_IF_ENABLED({
- QV4::Function *function;
- if (expression->sourceFile().isEmpty() && (function = expression->function())) {
- QQmlProfilerService::startHandlingSignal(
- function->sourceFile(), function->compiledFunction->location.line,
- function->compiledFunction->location.column);
-
- } else {
- QQmlProfilerService::startHandlingSignal(
- expression->sourceFile(), expression->lineNumber(),
- expression->columnNumber());
- }
- });
- }
-
- ~QQmlHandlingSignalProfiler()
- {
- Q_QML_PROFILE(endRange<QQmlProfilerService::HandlingSignal>());
- }
-};
-
-struct QQmlCompilingProfiler {
- QQmlCompilingProfiler(const QString &name)
- {
- Q_QML_PROFILE(startCompiling(name));
- }
-
- ~QQmlCompilingProfiler()
- {
- Q_QML_PROFILE(endRange<QQmlProfilerService::Compiling>());
- }
-};
-
-#define Q_QML_VME_PROFILE(Method) Q_QML_PROFILE_IF_ENABLED(Method)
-
-struct QQmlVmeProfiler {
-public:
-
- struct Data {
- Data() : line(0), column(0) {}
- QUrl url;
- int line;
- int column;
- QString typeName;
- };
-
- QQmlVmeProfiler() : running(false) {}
-
- void clear()
- {
- ranges.clear();
- if (running)
- QQmlProfilerService::m_instance->endRange<QQmlProfilerService::Creating>();
- for (int i = 0; i < backgroundRanges.count(); ++i) {
- QQmlProfilerService::m_instance->endRange<QQmlProfilerService::Creating>();
- }
- backgroundRanges.clear();
- running = false;
- }
-
- void startBackground(const QString &typeName)
- {
- if (running) {
- QQmlProfilerService::m_instance->endRange<QQmlProfilerService::Creating>();
- running = false;
- }
- QQmlProfilerService::m_instance->startCreating(typeName);
- backgroundRanges.push(typeName);
- }
-
- void start(const QString &typeName, const QUrl &url, int line, int column)
- {
- switchRange();
- setCurrentRange(typeName, url, line, column);
- QQmlProfilerService::m_instance->startCreating(typeName, url, line, column);
- }
-
- void stop()
- {
- if (running) {
- QQmlProfilerService::m_instance->endRange<QQmlProfilerService::Creating>();
- running = false;
- }
- }
-
- void pop()
- {
- if (ranges.count() > 0) {
- switchRange();
- currentRange = ranges.pop();
- QQmlProfilerService::m_instance->startCreating(currentRange.typeName, currentRange.url,
- currentRange.line, currentRange.column);
- }
- }
-
- void push()
- {
- if (running)
- ranges.push(currentRange);
- }
-
- void foreground(const QUrl &url, int line, int column)
- {
- if (backgroundRanges.count() > 0) {
- switchRange();
- setCurrentRange(backgroundRanges.pop(), url, line, column);
- QQmlProfilerService::m_instance->creatingLocation(url, line, column);
- }
- }
-
-private:
-
- void switchRange()
- {
- if (running)
- QQmlProfilerService::m_instance->endRange<QQmlProfilerService::Creating>();
- else
- running = true;
- }
-
- void setCurrentRange(const QString &typeName, const QUrl &url, int line, int column)
- {
- currentRange.typeName = typeName;
- currentRange.url = url;
- currentRange.line = line;
- currentRange.column = column;
- }
-
- Data currentRange;
- QStack<Data> ranges;
- QStack<QString> backgroundRanges;
- bool running;
};
QT_END_NAMESPACE