Remove "All rights reserved" line from license headers.
[profile/ivi/qtdeclarative.git] / src / declarative / debugger / qdeclarativedebugtrace.cpp
index befc3ea..ce94ed3 100644 (file)
@@ -1,8 +1,7 @@
 /****************************************************************************
 **
-** 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.
 **
@@ -35,6 +34,7 @@
 **
 **
 **
+**
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
 #include <QtCore/qdatastream.h>
 #include <QtCore/qurl.h>
 #include <QtCore/qtimer.h>
+#include <QtCore/qthread.h>
+#include <QtCore/qcoreapplication.h>
+
+// this contains QUnifiedTimer
+#include <private/qabstractanimation_p.h>
 
 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
 {
@@ -61,137 +66,212 @@ 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;
     return data;
 }
 
 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();
+
+        QUnifiedTimer::instance()->registerProfilerCallback( &animationFrame );
     }
 }
 
+QDeclarativeDebugTrace::~QDeclarativeDebugTrace()
+{
+}
+
+void QDeclarativeDebugTrace::initialize()
+{
+    // just make sure that the service is properly registered
+    traceInstance();
+}
+
+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)
+{
+    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};
+    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};
+    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};
+    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};
+    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};
+    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};
+    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};
+    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeEnd, (int)range, QString(), -1, -1, 0, 0};
     processMessage(rd);
 }
 
+void QDeclarativeDebugTrace::animationFrameImpl(qint64 delta)
+{
+    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, -1, fps, animCount};
+        processMessage(ed);
+    }
+}
+
 /*
     Either send the message directly, or queue up
     a list of messages to send later (via sendMessages)
 */
 void QDeclarativeDebugTrace::processMessage(const QDeclarativeDebugData &message)
 {
-    if (m_deferredSend)
-        m_data.append(message);
-    else
-        sendMessage(message.toByteArray());
+    QMutexLocker locker(&m_mutex);
+    m_data.append(message);
+}
+
+bool QDeclarativeDebugTrace::profilingEnabled()
+{
+    return m_enabled;
+}
+
+void QDeclarativeDebugTrace::setProfilingEnabled(bool enable)
+{
+    m_enabled = enable;
 }
 
 /*
@@ -199,18 +279,18 @@ void QDeclarativeDebugTrace::processMessage(const QDeclarativeDebugData &message
 */
 void QDeclarativeDebugTrace::sendMessages()
 {
-    if (m_deferredSend) {
-        //### 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)
@@ -218,12 +298,17 @@ void QDeclarativeDebugTrace::messageReceived(const QByteArray &message)
     QByteArray rwData = message;
     QDataStream stream(&rwData, QIODevice::ReadOnly);
 
-    stream >> m_enabled;
+    bool enabled;
+    stream >> enabled;
 
     m_messageReceived = true;
 
-    if (!m_enabled)
-        sendMessages();
+    if (enabled) {
+        startProfilingImpl();
+    } else {
+        if (stopProfilingImpl())
+            sendMessages();
+    }
 }
 
 QT_END_NAMESPACE