Skip to content

Commit

Permalink
Add a tracing API for the QML engine
Browse files Browse the repository at this point in the history
Change-Id: Ic03583444d586f275897d765be8e1b5e69fdd5d4
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
  • Loading branch information
Aaron Kennedy authored and Qt by Nokia committed Dec 14, 2011
1 parent 0f21883 commit e8d0ab4
Show file tree
Hide file tree
Showing 16 changed files with 577 additions and 14 deletions.
2 changes: 2 additions & 0 deletions src/declarative/qml/ftw/ftw.pri
Expand Up @@ -14,11 +14,13 @@ HEADERS += \
$$PWD/qdeletewatcher_p.h \
$$PWD/qrecyclepool_p.h \
$$PWD/qflagpointer_p.h \
$$PWD/qdeclarativetrace_p.h \

SOURCES += \
$$PWD/qintrusivelist.cpp \
$$PWD/qhashedstring.cpp \
$$PWD/qdeclarativepool.cpp \
$$PWD/qfastmetabuilder.cpp \
$$PWD/qdeclarativethread.cpp \
$$PWD/qdeclarativetrace.cpp \

11 changes: 11 additions & 0 deletions src/declarative/qml/ftw/qdeclarativepool_p.h
Expand Up @@ -55,6 +55,7 @@

#include <QtCore/qglobal.h>
#include <QtCore/qstring.h>
#include <QtCore/qurl.h>

QT_BEGIN_NAMESPACE

Expand Down Expand Up @@ -105,6 +106,7 @@ class Q_DECLARATIVE_EXPORT QDeclarativePool

inline QString *NewString(const QString &);
inline QByteArray *NewByteArray(const QByteArray &);
inline QUrl *NewUrl(const QUrl &);

template<typename T>
struct List {
Expand Down Expand Up @@ -145,6 +147,8 @@ class Q_DECLARATIVE_EXPORT QDeclarativePool
};
struct ByteArrayClass : public QByteArray, public Class {
};
struct UrlClass : public QUrl, public Class {
};

inline void *allocate(int size);
void newpage();
Expand Down Expand Up @@ -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))
Expand Down
154 changes: 154 additions & 0 deletions 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

0 comments on commit e8d0ab4

Please sign in to comment.