/****************************************************************************
**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
+** 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_END_LICENSE$
**
****************************************************************************/
QT_BEGIN_NAMESPACE
-Q_GLOBAL_STATIC(QDeclarativeDebugTrace, traceInstance);
+Q_GLOBAL_STATIC(QDeclarativeDebugTrace, traceInstance)
// convert to a QByteArray that can be sent to the debug client
-// use of QDataStream can skew results if m_deferredSend == false
+// use of QDataStream can skew results
// (see tst_qdeclarativedebugtrace::trace() benchmark)
QByteArray QDeclarativeDebugData::toByteArray() const
{
if (messageType == (int)QDeclarativeDebugTrace::RangeData)
ds << detailData;
if (messageType == (int)QDeclarativeDebugTrace::RangeLocation)
- ds << detailData << line;
+ ds << detailData << line << column;
if (messageType == (int)QDeclarativeDebugTrace::Event &&
detailType == (int)QDeclarativeDebugTrace::AnimationFrame)
ds << framerate << animationcount;
}
QDeclarativeDebugTrace::QDeclarativeDebugTrace()
- : QDeclarativeDebugService(QLatin1String("CanvasFrameRate")),
- m_enabled(false), m_deferredSend(true), m_messageReceived(false)
+ : QDeclarativeDebugService(QLatin1String("CanvasFrameRate"), 1),
+ m_enabled(false), m_messageReceived(false)
{
m_timer.start();
- if (status() == Enabled) {
+
+ if (registerService() == Enabled) {
// wait for first message indicating whether to trace or not
while (!m_messageReceived)
waitForMessage();
{
}
-void QDeclarativeDebugTrace::addEngine(QDeclarativeEngine * /*engine*/)
+void QDeclarativeDebugTrace::initialize()
{
// just make sure that the service is properly registered
traceInstance();
}
-void QDeclarativeDebugTrace::removeEngine(QDeclarativeEngine */*engine*/)
+bool QDeclarativeDebugTrace::startProfiling()
{
+ return traceInstance()->startProfilingImpl();
+}
+bool QDeclarativeDebugTrace::stopProfiling()
+{
+ return traceInstance()->stopProfilingImpl();
}
void QDeclarativeDebugTrace::addEvent(EventType t)
{
- if (QDeclarativeDebugService::isDebuggingEnabled())
- traceInstance()->addEventImpl(t);
+ traceInstance()->addEventImpl(t);
}
void QDeclarativeDebugTrace::startRange(RangeType t)
{
- if (QDeclarativeDebugService::isDebuggingEnabled())
- traceInstance()->startRangeImpl(t);
+ traceInstance()->startRangeImpl(t);
}
void QDeclarativeDebugTrace::rangeData(RangeType t, const QString &data)
{
- if (QDeclarativeDebugService::isDebuggingEnabled())
- traceInstance()->rangeDataImpl(t, data);
+ traceInstance()->rangeDataImpl(t, data);
}
void QDeclarativeDebugTrace::rangeData(RangeType t, const QUrl &data)
{
- if (QDeclarativeDebugService::isDebuggingEnabled())
- traceInstance()->rangeDataImpl(t, data);
+ traceInstance()->rangeDataImpl(t, data);
}
-void QDeclarativeDebugTrace::rangeLocation(RangeType t, const QString &fileName, int line)
+void QDeclarativeDebugTrace::rangeLocation(RangeType t, const QString &fileName, int line, int column)
{
- if (QDeclarativeDebugService::isDebuggingEnabled())
- traceInstance()->rangeLocationImpl(t, fileName, line);
+ traceInstance()->rangeLocationImpl(t, fileName, line, column);
}
-void QDeclarativeDebugTrace::rangeLocation(RangeType t, const QUrl &fileName, int line)
+void QDeclarativeDebugTrace::rangeLocation(RangeType t, const QUrl &fileName, int line, int column)
{
- if (QDeclarativeDebugService::isDebuggingEnabled())
- traceInstance()->rangeLocationImpl(t, fileName, line);
+ traceInstance()->rangeLocationImpl(t, fileName, line, column);
}
void QDeclarativeDebugTrace::endRange(RangeType t)
{
- if (QDeclarativeDebugService::isDebuggingEnabled())
- traceInstance()->endRangeImpl(t);
+ traceInstance()->endRangeImpl(t);
}
void QDeclarativeDebugTrace::animationFrame(qint64 delta)
{
- Q_ASSERT(QDeclarativeDebugService::isDebuggingEnabled());
traceInstance()->animationFrameImpl(delta);
}
+void QDeclarativeDebugTrace::sendProfilingData()
+{
+ traceInstance()->sendMessages();
+}
+
+bool QDeclarativeDebugTrace::startProfilingImpl()
+{
+ bool success = false;
+ if (!profilingEnabled()) {
+ setProfilingEnabled(true);
+ addEventImpl(StartTrace);
+ success = true;
+ }
+ return success;
+}
+
+bool QDeclarativeDebugTrace::stopProfilingImpl()
+{
+ bool success = false;
+ if (profilingEnabled()) {
+ addEventImpl(EndTrace);
+ setProfilingEnabled(false);
+ success = true;
+ }
+ return success;
+}
+
void QDeclarativeDebugTrace::addEventImpl(EventType event)
{
- if (status() != Enabled || !m_enabled)
+ if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QDeclarativeDebugData ed = {m_timer.nsecsElapsed(), (int)Event, (int)event, QString(), -1, 0, 0};
+ QDeclarativeDebugData ed = {m_timer.nsecsElapsed(), (int)Event, (int)event, QString(), -1, -1, 0, 0};
processMessage(ed);
}
void QDeclarativeDebugTrace::startRangeImpl(RangeType range)
{
- if (status() != Enabled || !m_enabled)
+ if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeStart, (int)range, QString(), -1, 0, 0};
+ QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeStart, (int)range, QString(), -1, -1, 0, 0};
processMessage(rd);
}
void QDeclarativeDebugTrace::rangeDataImpl(RangeType range, const QString &rData)
{
- if (status() != Enabled || !m_enabled)
+ if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData, -1, 0, 0};
+ QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData, -1, -1, 0, 0};
processMessage(rd);
}
void QDeclarativeDebugTrace::rangeDataImpl(RangeType range, const QUrl &rData)
{
- if (status() != Enabled || !m_enabled)
+ if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData.toString(QUrl::FormattingOption(0x100)), -1, 0, 0};
+ QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData.toString(QUrl::FormattingOption(0x100)), -1, -1, 0, 0};
processMessage(rd);
}
-void QDeclarativeDebugTrace::rangeLocationImpl(RangeType range, const QString &fileName, int line)
+void QDeclarativeDebugTrace::rangeLocationImpl(RangeType range, const QString &fileName, int line, int column)
{
- if (status() != Enabled || !m_enabled)
+ if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName, line, 0, 0};
+ QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName, line, column, 0, 0};
processMessage(rd);
}
-void QDeclarativeDebugTrace::rangeLocationImpl(RangeType range, const QUrl &fileName, int line)
+void QDeclarativeDebugTrace::rangeLocationImpl(RangeType range, const QUrl &fileName, int line, int column)
{
- if (status() != Enabled || !m_enabled)
+ if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName.toString(QUrl::FormattingOption(0x100)), line, 0, 0};
+ QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName.toString(QUrl::FormattingOption(0x100)), line, column, 0, 0};
processMessage(rd);
}
void QDeclarativeDebugTrace::endRangeImpl(RangeType range)
{
- if (status() != Enabled || !m_enabled)
+ if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeEnd, (int)range, QString(), -1, 0, 0};
+ QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeEnd, (int)range, QString(), -1, -1, 0, 0};
processMessage(rd);
}
void QDeclarativeDebugTrace::animationFrameImpl(qint64 delta)
{
- if (status() != Enabled || !m_enabled)
+ Q_ASSERT(QDeclarativeDebugService::isDebuggingEnabled());
+ if (!m_enabled)
return;
int animCount = QUnifiedTimer::instance()->runningAnimationCount();
if (animCount > 0 && delta > 0) {
// trim fps to integer
int fps = 1000 / delta;
- QDeclarativeDebugData ed = {m_timer.nsecsElapsed(), (int)Event, (int)AnimationFrame, QString(), -1, fps, animCount};
+ QDeclarativeDebugData ed = {m_timer.nsecsElapsed(), (int)Event, (int)AnimationFrame, QString(), -1, -1, fps, animCount};
processMessage(ed);
}
}
void QDeclarativeDebugTrace::processMessage(const QDeclarativeDebugData &message)
{
QMutexLocker locker(&m_mutex);
- if (m_deferredSend
- || (QThread::currentThread() != QCoreApplication::instance()->thread()))
- m_data.append(message);
- else
- sendMessage(message.toByteArray());
+ m_data.append(message);
+}
+
+bool QDeclarativeDebugTrace::profilingEnabled()
+{
+ return m_enabled;
+}
+
+void QDeclarativeDebugTrace::setProfilingEnabled(bool enable)
+{
+ m_enabled = enable;
}
/*
*/
void QDeclarativeDebugTrace::sendMessages()
{
- if (m_deferredSend) {
- QMutexLocker locker(&m_mutex);
- //### this is a suboptimal way to send batched messages
- for (int i = 0; i < m_data.count(); ++i)
- sendMessage(m_data.at(i).toByteArray());
- m_data.clear();
-
- //indicate completion
- QByteArray data;
- QDataStream ds(&data, QIODevice::WriteOnly);
- ds << (qint64)-1 << (int)Complete;
- sendMessage(data);
- }
+ QMutexLocker locker(&m_mutex);
+ 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);
}
void QDeclarativeDebugTrace::messageReceived(const QByteArray &message)
QByteArray rwData = message;
QDataStream stream(&rwData, QIODevice::ReadOnly);
- bool wasEnabled = m_enabled;
- stream >> m_enabled;
+ bool enabled;
+ stream >> enabled;
m_messageReceived = true;
- if (!m_enabled && wasEnabled) {
- m_enabled = true;
- addEvent(EndTrace);
- m_enabled = false;
- sendMessages();
+ if (enabled) {
+ startProfilingImpl();
+ } else {
+ if (stopProfilingImpl())
+ sendMessages();
}
}