aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/ftw
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-12-09 12:39:23 +0000
committerQt by Nokia <qt-info@nokia.com>2011-12-14 04:52:08 +0100
commite8d0ab4b01cabf31d9bff31a821928d846c2f0af (patch)
treee58f5d7a4a93b66a487ad9ea09b4f10d803b10c4 /src/declarative/qml/ftw
parent0f2188361b996c4d8b8901412cdcebf35bad1e53 (diff)
Add a tracing API for the QML engine
Change-Id: Ic03583444d586f275897d765be8e1b5e69fdd5d4 Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Diffstat (limited to 'src/declarative/qml/ftw')
-rw-r--r--src/declarative/qml/ftw/ftw.pri2
-rw-r--r--src/declarative/qml/ftw/qdeclarativepool_p.h11
-rw-r--r--src/declarative/qml/ftw/qdeclarativetrace.cpp154
-rw-r--r--src/declarative/qml/ftw/qdeclarativetrace_p.h294
4 files changed, 461 insertions, 0 deletions
diff --git a/src/declarative/qml/ftw/ftw.pri b/src/declarative/qml/ftw/ftw.pri
index 9df0af8146..44141223bf 100644
--- a/src/declarative/qml/ftw/ftw.pri
+++ b/src/declarative/qml/ftw/ftw.pri
@@ -14,6 +14,7 @@ HEADERS += \
$$PWD/qdeletewatcher_p.h \
$$PWD/qrecyclepool_p.h \
$$PWD/qflagpointer_p.h \
+ $$PWD/qdeclarativetrace_p.h \
SOURCES += \
$$PWD/qintrusivelist.cpp \
@@ -21,4 +22,5 @@ SOURCES += \
$$PWD/qdeclarativepool.cpp \
$$PWD/qfastmetabuilder.cpp \
$$PWD/qdeclarativethread.cpp \
+ $$PWD/qdeclarativetrace.cpp \
diff --git a/src/declarative/qml/ftw/qdeclarativepool_p.h b/src/declarative/qml/ftw/qdeclarativepool_p.h
index 60ff4fa359..3a7133c7fb 100644
--- a/src/declarative/qml/ftw/qdeclarativepool_p.h
+++ b/src/declarative/qml/ftw/qdeclarativepool_p.h
@@ -55,6 +55,7 @@
#include <QtCore/qglobal.h>
#include <QtCore/qstring.h>
+#include <QtCore/qurl.h>
QT_BEGIN_NAMESPACE
@@ -105,6 +106,7 @@ public:
inline QString *NewString(const QString &);
inline QByteArray *NewByteArray(const QByteArray &);
+ inline QUrl *NewUrl(const QUrl &);
template<typename T>
struct List {
@@ -145,6 +147,8 @@ private:
};
struct ByteArrayClass : public QByteArray, public Class {
};
+ struct UrlClass : public QUrl, public Class {
+ };
inline void *allocate(int size);
void newpage();
@@ -222,6 +226,13 @@ QByteArray *QDeclarativePool::NewByteArray(const QByteArray &s)
return rv;
}
+QUrl *QDeclarativePool::NewUrl(const QUrl &s)
+{
+ QUrl *rv = New<UrlClass>();
+ *rv = s;
+ return rv;
+}
+
void *QDeclarativePool::allocate(int size)
{
if (!_page || (_page->header.free + size) > (_page->memory + Page::pageSize))
diff --git a/src/declarative/qml/ftw/qdeclarativetrace.cpp b/src/declarative/qml/ftw/qdeclarativetrace.cpp
new file mode 100644
index 0000000000..61e84075aa
--- /dev/null
+++ b/src/declarative/qml/ftw/qdeclarativetrace.cpp
@@ -0,0 +1,154 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** 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 "qdeclarativetrace_p.h"
+
+#ifdef QML_ENABLE_TRACE
+#include <stdio.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#ifdef QML_ENABLE_TRACE
+
+QDeclarativeTrace::Pool QDeclarativeTrace::logPool;
+QDeclarativeTrace::Entry *QDeclarativeTrace::first = 0;
+QDeclarativeTrace::Entry *QDeclarativeTrace::last = 0;
+
+static qint64 toNsecs(QDeclarativeTrace::TimeType time)
+{
+#ifdef Q_OS_MAC
+ static mach_timebase_info_data_t info = {0,0};
+ if (info.denom == 0)
+ mach_timebase_info(&info);
+ return time * info.numer / info.denom;
+#else
+ qint64 rv = time.tv_sec * 1000000000 + time.tv_nsec;
+ return rv;
+#endif
+}
+
+QDeclarativeTrace::Pool::Pool()
+{
+ first = New<Entry>();
+ last = first;
+}
+
+QDeclarativeTrace::Pool::~Pool()
+{
+ char buffer[128];
+ sprintf(buffer, "qml.%d.log", ::getpid());
+ FILE *out = fopen(buffer, "w");
+ if (!out) {
+ fprintf (stderr, "QML Log: Could not open %s\n", buffer);
+ return;
+ } else {
+ fprintf (stderr, "QML Log: Writing log to %s\n", buffer);
+ }
+
+ QDeclarativeTrace::Entry *cur = QDeclarativeTrace::first;
+ QByteArray indent;
+ int depth = -1;
+
+ qint64 firstTime = -1;
+
+ while (cur) {
+
+ switch (cur->type) {
+ case QDeclarativeTrace::Entry::RangeStart: {
+ RangeStart *rs = static_cast<QDeclarativeTrace::RangeStart *>(cur);
+
+ qint64 nsecs = toNsecs(rs->time);
+
+ if (firstTime == -1)
+ firstTime = nsecs;
+
+ nsecs -= firstTime;
+
+ depth++;
+ indent = QByteArray(depth * 4, ' ');
+ fprintf(out, "%s%s @%lld (%lld ns)\n", indent.constData(),
+ rs->description, nsecs, toNsecs(rs->end->time) - nsecs - firstTime);
+ } break;
+ case QDeclarativeTrace::Entry::RangeEnd:
+ depth--;
+ indent = QByteArray(depth * 4, ' ');
+ break;
+ case QDeclarativeTrace::Entry::Detail:
+ fprintf(out, "%s %s\n", indent.constData(),
+ static_cast<QDeclarativeTrace::Detail *>(cur)->description);
+ break;
+ case QDeclarativeTrace::Entry::IntDetail:
+ fprintf(out, "%s %s: %d\n", indent.constData(),
+ static_cast<QDeclarativeTrace::Detail *>(cur)->description,
+ static_cast<QDeclarativeTrace::IntDetail *>(cur)->value);
+ break;
+ case QDeclarativeTrace::Entry::StringDetail: {
+ QByteArray vLatin1 = static_cast<QDeclarativeTrace::StringDetail *>(cur)->value->toLatin1();
+ fprintf(out, "%s %s: %s\n", indent.constData(),
+ static_cast<QDeclarativeTrace::Detail *>(cur)->description,
+ vLatin1.constData());
+ } break;
+ case QDeclarativeTrace::Entry::UrlDetail: {
+ QByteArray vLatin1 = static_cast<QDeclarativeTrace::UrlDetail *>(cur)->value->toString().toLatin1();
+ fprintf(out, "%s %s: %s\n", indent.constData(),
+ static_cast<QDeclarativeTrace::Detail *>(cur)->description,
+ vLatin1.constData());
+ } break;
+ case QDeclarativeTrace::Entry::Event: {
+ Event *ev = static_cast<QDeclarativeTrace::Event *>(cur);
+ qint64 nsecs = toNsecs(ev->time) - firstTime;
+ fprintf(out, "%s + %s @%lld +%lld ns\n", indent.constData(),
+ ev->description, nsecs, nsecs - (toNsecs(ev->start->time) - firstTime));
+ } break;
+ case QDeclarativeTrace::Entry::Null:
+ default:
+ break;
+ }
+ cur = cur->next;
+ }
+ fclose(out);
+}
+
+#endif
+
+QT_END_NAMESPACE
+
diff --git a/src/declarative/qml/ftw/qdeclarativetrace_p.h b/src/declarative/qml/ftw/qdeclarativetrace_p.h
new file mode 100644
index 0000000000..6fac53967a
--- /dev/null
+++ b/src/declarative/qml/ftw/qdeclarativetrace_p.h
@@ -0,0 +1,294 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** 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$
+**
+****************************************************************************/
+
+#ifndef QDECLARATIVETRACE_P_H
+#define QDECLARATIVETRACE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+#include <private/qdeclarativepool_p.h>
+
+// #define QML_ENABLE_TRACE
+
+#if defined(QML_ENABLE_TRACE) && defined(Q_OS_MAC)
+#include <mach/mach_time.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QUrl;
+class QDeclarativeTrace
+{
+public:
+ inline QDeclarativeTrace(const char *desc);
+ inline ~QDeclarativeTrace();
+
+ inline void addDetail(const char *);
+ inline void addDetail(const char *, int);
+ inline void addDetail(const char *, const QString &);
+ inline void addDetail(const char *, const QUrl &);
+
+ inline void event(const char *desc);
+
+#ifdef QML_ENABLE_TRACE
+
+#ifdef Q_OS_MAC
+ typedef uint64_t TimeType;
+#else
+ typedef timespec TimeType;
+#endif
+
+ struct Entry : public QDeclarativePool::POD {
+ enum Type { Null, RangeStart, RangeEnd, Detail, IntDetail, StringDetail, UrlDetail, Event };
+ inline Entry();
+ inline Entry(Type);
+ Type type;
+ Entry *next;
+ };
+ struct RangeEnd : public Entry {
+ inline RangeEnd();
+ TimeType time;
+ };
+ struct RangeStart : public Entry {
+ inline RangeStart();
+ const char *description;
+ TimeType time;
+ QDeclarativeTrace::RangeEnd *end;
+ };
+ struct Detail : public Entry {
+ inline Detail();
+ inline Detail(Type t);
+ const char *description;
+ };
+ struct IntDetail : public Detail {
+ inline IntDetail();
+ int value;
+ };
+ struct StringDetail : public Detail {
+ inline StringDetail();
+ QString *value;
+ };
+ struct UrlDetail : public Detail {
+ inline UrlDetail();
+ QUrl *value;
+ };
+ struct Event : public Entry {
+ inline Event();
+ const char *description;
+ TimeType time;
+ QDeclarativeTrace::RangeStart *start;
+ };
+
+ struct Pool : public QDeclarativePool {
+ Pool();
+ ~Pool();
+ };
+
+ static Pool logPool;
+ static Entry *first;
+ static Entry *last;
+
+private:
+ RangeStart *start;
+
+ static TimeType gettime() {
+#ifdef Q_OS_MAC
+ return mach_absolute_time();
+#else
+ TimeType ts;
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ return ts;
+#endif
+ }
+#endif
+};
+
+#ifdef QML_ENABLE_TRACE
+QDeclarativeTrace::Entry::Entry()
+: type(Null), next(0)
+{
+}
+
+QDeclarativeTrace::Entry::Entry(Type type)
+: type(type), next(0)
+{
+ QDeclarativeTrace::last->next = this;
+ QDeclarativeTrace::last = this;
+}
+
+QDeclarativeTrace::RangeEnd::RangeEnd()
+: QDeclarativeTrace::Entry(QDeclarativeTrace::Entry::RangeEnd),
+ time(gettime())
+{
+}
+
+QDeclarativeTrace::RangeStart::RangeStart()
+: QDeclarativeTrace::Entry(QDeclarativeTrace::Entry::RangeStart),
+ description(0), time(gettime())
+{
+}
+
+QDeclarativeTrace::Detail::Detail()
+: QDeclarativeTrace::Entry(QDeclarativeTrace::Entry::Detail),
+ description(0)
+{
+}
+
+QDeclarativeTrace::Detail::Detail(Type type)
+: QDeclarativeTrace::Entry(type), description(0)
+{
+}
+
+QDeclarativeTrace::IntDetail::IntDetail()
+: QDeclarativeTrace::Detail(QDeclarativeTrace::Entry::IntDetail),
+ value(0)
+{
+}
+
+QDeclarativeTrace::StringDetail::StringDetail()
+: QDeclarativeTrace::Detail(QDeclarativeTrace::Entry::StringDetail),
+ value(0)
+{
+}
+
+QDeclarativeTrace::UrlDetail::UrlDetail()
+: QDeclarativeTrace::Detail(QDeclarativeTrace::Entry::UrlDetail),
+ value(0)
+{
+}
+
+QDeclarativeTrace::Event::Event()
+: QDeclarativeTrace::Entry(QDeclarativeTrace::Entry::Event),
+ description(0), time(gettime()), start(0)
+{
+}
+#endif
+
+QDeclarativeTrace::QDeclarativeTrace(const char *desc)
+{
+#ifdef QML_ENABLE_TRACE
+ RangeStart *e = logPool.New<RangeStart>();
+ e->description = desc;
+ e->end = 0;
+ start = e;
+#else
+ Q_UNUSED(desc);
+#endif
+}
+
+QDeclarativeTrace::~QDeclarativeTrace()
+{
+#ifdef QML_ENABLE_TRACE
+ RangeEnd *e = logPool.New<RangeEnd>();
+ start->end = e;
+#endif
+}
+
+void QDeclarativeTrace::addDetail(const char *desc)
+{
+#ifdef QML_ENABLE_TRACE
+ Detail *e = logPool.New<Detail>();
+ e->description = desc;
+#else
+ Q_UNUSED(desc);
+#endif
+}
+
+void QDeclarativeTrace::addDetail(const char *desc, int v)
+{
+#ifdef QML_ENABLE_TRACE
+ IntDetail *e = logPool.New<IntDetail>();
+ e->description = desc;
+ e->value = v;
+#else
+ Q_UNUSED(desc);
+ Q_UNUSED(v);
+#endif
+}
+
+void QDeclarativeTrace::addDetail(const char *desc, const QString &v)
+{
+#ifdef QML_ENABLE_TRACE
+ StringDetail *e = logPool.New<StringDetail>();
+ e->description = desc;
+ e->value = logPool.NewString(v);
+#else
+ Q_UNUSED(desc);
+ Q_UNUSED(v);
+#endif
+}
+
+void QDeclarativeTrace::addDetail(const char *desc, const QUrl &v)
+{
+#ifdef QML_ENABLE_TRACE
+ UrlDetail *e = logPool.New<UrlDetail>();
+ e->description = desc;
+ e->value = logPool.NewUrl(v);
+#else
+ Q_UNUSED(desc);
+ Q_UNUSED(v);
+#endif
+}
+
+void QDeclarativeTrace::event(const char *desc)
+{
+#ifdef QML_ENABLE_TRACE
+ Event *e = logPool.New<Event>();
+ e->start = start;
+ e->description = desc;
+#else
+ Q_UNUSED(desc);
+#endif
+}
+
+QT_END_NAMESPACE
+
+#endif // QDECLARATIVETRACE_P_H