Profiler: Use RAII helper structs for ranges
authorKai Koehne <kai.koehne@nokia.com>
Wed, 29 Feb 2012 13:59:49 +0000 (14:59 +0100)
committerQt by Nokia <qt-info@nokia.com>
Fri, 2 Mar 2012 15:19:16 +0000 (16:19 +0100)
Exclusively use RAII helper structs for ranges.

Change-Id: Ief9ab25a9e49e1b2c3c091e5d9de6479e36eaa50
Reviewed-by: Christiaan Janssen <christiaan.janssen@nokia.com>
src/declarative/debugger/qdeclarativeprofilerservice.cpp
src/declarative/debugger/qdeclarativeprofilerservice_p.h
src/declarative/qml/qdeclarativeboundsignal.cpp
src/declarative/qml/qdeclarativecomponent.cpp
src/declarative/qml/qdeclarativecomponent_p.h
src/declarative/qml/qdeclarativeengine.cpp
src/declarative/qml/qdeclarativetypeloader.cpp
tests/auto/declarative/debugger/qdeclarativeprofilerservice/qdeclarativeprofilerservice.pro

index 074355f..3ad8749 100644 (file)
 
 QT_BEGIN_NAMESPACE
 
+// instance will be set, unset in constructor. Allows static methods to be inlined.
+QDeclarativeProfilerService *QDeclarativeProfilerService::instance = 0;
 Q_GLOBAL_STATIC(QDeclarativeProfilerService, profilerInstance)
 
-QDeclarativeBindingProfiler::QDeclarativeBindingProfiler(const QString &url, int line, int column)
-{
-    QDeclarativeProfilerService::startRange(QDeclarativeProfilerService::Binding);
-    QDeclarativeProfilerService::rangeLocation(QDeclarativeProfilerService::Binding, url, line, column);
-}
-
-QDeclarativeBindingProfiler::~QDeclarativeBindingProfiler()
-{
-    QDeclarativeProfilerService::endRange(QDeclarativeProfilerService::Binding);
-}
-
-void QDeclarativeBindingProfiler::addDetail(const QString &details)
-{
-    QDeclarativeProfilerService::rangeData(QDeclarativeProfilerService::Binding, details);
-}
 
 // convert to a QByteArray that can be sent to the debug client
 // use of QDataStream can skew results
@@ -106,12 +93,13 @@ QDeclarativeProfilerService::QDeclarativeProfilerService()
 
 QDeclarativeProfilerService::~QDeclarativeProfilerService()
 {
+    instance = 0;
 }
 
 void QDeclarativeProfilerService::initialize()
 {
     // just make sure that the service is properly registered
-    profilerInstance();
+    instance = profilerInstance();
 }
 
 bool QDeclarativeProfilerService::startProfiling()
@@ -134,31 +122,6 @@ void QDeclarativeProfilerService::addEvent(EventType t)
     profilerInstance()->addEventImpl(t);
 }
 
-void QDeclarativeProfilerService::startRange(RangeType t)
-{
-    profilerInstance()->startRangeImpl(t);
-}
-
-void QDeclarativeProfilerService::rangeData(RangeType t, const QString &data)
-{
-    profilerInstance()->rangeDataImpl(t, data);
-}
-
-void QDeclarativeProfilerService::rangeLocation(RangeType t, const QString &fileName, int line, int column)
-{
-    profilerInstance()->rangeLocationImpl(t, fileName, line, column);
-}
-
-void QDeclarativeProfilerService::rangeLocation(RangeType t, const QUrl &fileName, int line, int column)
-{
-    profilerInstance()->rangeLocationImpl(t, fileName, line, column);
-}
-
-void QDeclarativeProfilerService::endRange(RangeType t)
-{
-    profilerInstance()->endRangeImpl(t);
-}
-
 void QDeclarativeProfilerService::animationFrame(qint64 delta)
 {
     profilerInstance()->animationFrameImpl(delta);
@@ -209,7 +172,7 @@ void QDeclarativeProfilerService::addEventImpl(EventType event)
     processMessage(ed);
 }
 
-void QDeclarativeProfilerService::startRangeImpl(RangeType range)
+void QDeclarativeProfilerService::startRange(RangeType range)
 {
     if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
         return;
@@ -218,7 +181,7 @@ void QDeclarativeProfilerService::startRangeImpl(RangeType range)
     processMessage(rd);
 }
 
-void QDeclarativeProfilerService::rangeDataImpl(RangeType range, const QString &rData)
+void QDeclarativeProfilerService::rangeData(RangeType range, const QString &rData)
 {
     if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
         return;
@@ -227,7 +190,7 @@ void QDeclarativeProfilerService::rangeDataImpl(RangeType range, const QString &
     processMessage(rd);
 }
 
-void QDeclarativeProfilerService::rangeDataImpl(RangeType range, const QUrl &rData)
+void QDeclarativeProfilerService::rangeData(RangeType range, const QUrl &rData)
 {
     if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
         return;
@@ -236,7 +199,7 @@ void QDeclarativeProfilerService::rangeDataImpl(RangeType range, const QUrl &rDa
     processMessage(rd);
 }
 
-void QDeclarativeProfilerService::rangeLocationImpl(RangeType range, const QString &fileName, int line, int column)
+void QDeclarativeProfilerService::rangeLocation(RangeType range, const QString &fileName, int line, int column)
 {
     if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
         return;
@@ -245,7 +208,7 @@ void QDeclarativeProfilerService::rangeLocationImpl(RangeType range, const QStri
     processMessage(rd);
 }
 
-void QDeclarativeProfilerService::rangeLocationImpl(RangeType range, const QUrl &fileName, int line, int column)
+void QDeclarativeProfilerService::rangeLocation(RangeType range, const QUrl &fileName, int line, int column)
 {
     if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
         return;
@@ -254,7 +217,7 @@ void QDeclarativeProfilerService::rangeLocationImpl(RangeType range, const QUrl
     processMessage(rd);
 }
 
-void QDeclarativeProfilerService::endRangeImpl(RangeType range)
+void QDeclarativeProfilerService::endRange(RangeType range)
 {
     if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled)
         return;
index d2f263c..ef92e68 100644 (file)
@@ -57,6 +57,7 @@
 #include <QtCore/qelapsedtimer.h>
 #include <QtCore/qmutex.h>
 #include <QtCore/qvector.h>
+#include <QtCore/qstringbuilder.h>
 
 QT_BEGIN_HEADER
 
@@ -83,13 +84,6 @@ Q_DECLARE_TYPEINFO(QDeclarativeProfilerData, Q_MOVABLE_TYPE);
 class QUrl;
 class QDeclarativeEngine;
 
-// RAII
-class Q_AUTOTEST_EXPORT QDeclarativeBindingProfiler {
-public:
-    QDeclarativeBindingProfiler(const QString &url, int line, int column);
-    ~QDeclarativeBindingProfiler();
-    void addDetail(const QString &details);
-};
 
 class Q_DECLARATIVE_EXPORT QDeclarativeProfilerService : public QDeclarativeDebugService
 {
@@ -132,11 +126,6 @@ public:
     static bool stopProfiling();
     static void sendStartedProfilingMessage();
     static void addEvent(EventType);
-    static void startRange(RangeType);
-    static void rangeData(RangeType, const QString &);
-    static void rangeLocation(RangeType, const QString &, int, int);
-    static void rangeLocation(RangeType, const QUrl &, int, int);
-    static void endRange(RangeType);
     static void animationFrame(qint64);
 
     static void sendProfilingData();
@@ -153,14 +142,16 @@ private:
     bool stopProfilingImpl();
     void sendStartedProfilingMessageImpl();
     void addEventImpl(EventType);
-    void startRangeImpl(RangeType);
-    void rangeDataImpl(RangeType, const QString &);
-    void rangeDataImpl(RangeType, const QUrl &);
-    void rangeLocationImpl(RangeType, const QString &, int, int);
-    void rangeLocationImpl(RangeType, const QUrl &, int, int);
-    void endRangeImpl(RangeType);
     void animationFrameImpl(qint64);
 
+    void startRange(RangeType);
+    void rangeData(RangeType, const QString &);
+    void rangeData(RangeType, const QUrl &);
+    void rangeLocation(RangeType, const QString &, int, int);
+    void rangeLocation(RangeType, const QUrl &, int, int);
+    void endRange(RangeType);
+
+
     bool profilingEnabled();
     void setProfilingEnabled(bool enable);
     void sendMessages();
@@ -172,6 +163,135 @@ private:
     bool m_messageReceived;
     QVector<QDeclarativeProfilerData> m_data;
     QMutex m_mutex;
+
+    static QDeclarativeProfilerService *instance;
+
+    friend struct QDeclarativeBindingProfiler;
+    friend struct QDeclarativeHandlingSignalProfiler;
+    friend struct QDeclarativeObjectCreatingProfiler;
+    friend struct QDeclarativeCompilingProfiler;
+};
+
+//
+// RAII helper structs
+//
+
+struct QDeclarativeBindingProfiler {
+    QDeclarativeBindingProfiler(const QString &url, int line, int column)
+    {
+        QDeclarativeProfilerService *instance = QDeclarativeProfilerService::instance;
+        enabled = instance ? instance->profilingEnabled() : false;
+        if (enabled) {
+            instance->startRange(QDeclarativeProfilerService::Binding);
+            instance->rangeLocation(QDeclarativeProfilerService::Binding, url, line, column);
+        }
+    }
+
+    ~QDeclarativeBindingProfiler()
+    {
+        if (enabled)
+            QDeclarativeProfilerService::instance->endRange(QDeclarativeProfilerService::Binding);
+    }
+
+    void addDetail(const QString &details)
+    {
+        if (enabled)
+            QDeclarativeProfilerService::instance->rangeData(QDeclarativeProfilerService::Binding,
+                                                             details);
+    }
+\
+    bool enabled;
+};
+
+struct QDeclarativeHandlingSignalProfiler {
+    QDeclarativeHandlingSignalProfiler()
+    {
+        enabled = QDeclarativeProfilerService::instance
+                ? QDeclarativeProfilerService::instance->profilingEnabled() : false;
+        if (enabled) {
+            QDeclarativeProfilerService::instance->startRange(
+                        QDeclarativeProfilerService::HandlingSignal);
+        }
+    }
+
+    void setSignalInfo(const QString &name, const QString &expression)
+    {
+        if (enabled)
+            QDeclarativeProfilerService::instance->rangeData(
+                        QDeclarativeProfilerService::HandlingSignal,
+                        name % QLatin1String(": ") % expression);
+    }
+
+    void setLocation(const QString &file, int line, int column)
+    {
+        if (enabled)
+            QDeclarativeProfilerService::instance->rangeLocation(
+                        QDeclarativeProfilerService::HandlingSignal, file, line, column);
+    }
+
+    ~QDeclarativeHandlingSignalProfiler()
+    {
+        if (enabled)
+            QDeclarativeProfilerService::instance->endRange(
+                        QDeclarativeProfilerService::HandlingSignal);
+    }
+
+    bool enabled;
+};
+
+struct QDeclarativeObjectCreatingProfiler {
+    QDeclarativeObjectCreatingProfiler()
+    {
+        QDeclarativeProfilerService *instance = QDeclarativeProfilerService::instance;
+        enabled = instance ?
+                    instance->profilingEnabled() : false;
+        if (enabled)
+            instance->startRange(QDeclarativeProfilerService::Creating);
+    }
+
+    void setTypeName(const QString &typeName)
+    {
+        if (enabled)
+            QDeclarativeProfilerService::instance->rangeData(
+                        QDeclarativeProfilerService::Creating, typeName);
+    }
+
+    void setLocation(const QUrl &url, int line, int column)
+    {
+        if (enabled)
+            QDeclarativeProfilerService::instance->rangeLocation(
+                        QDeclarativeProfilerService::Creating, url, line, column);
+    }
+
+    ~QDeclarativeObjectCreatingProfiler()
+    {
+        if (enabled)
+            QDeclarativeProfilerService::instance->endRange(QDeclarativeProfilerService::Creating);
+    }
+
+    bool enabled;
+};
+
+struct QDeclarativeCompilingProfiler {
+    QDeclarativeCompilingProfiler(const QString &name)
+    {
+        QDeclarativeProfilerService *instance = QDeclarativeProfilerService::instance;
+        enabled = instance ?
+                    instance->profilingEnabled() : false;
+        if (enabled) {
+            instance->startRange(QDeclarativeProfilerService::Compiling);
+            instance->rangeLocation(QDeclarativeProfilerService::Compiling, name, 1, 1);
+            instance->rangeData(QDeclarativeProfilerService::Compiling, name);
+        }
+    }
+
+    ~QDeclarativeCompilingProfiler()
+    {
+        if (enabled)
+            QDeclarativeProfilerService::instance->endRange(QDeclarativeProfilerService::Compiling);
+    }
+
+    bool enabled;
 };
 
 QT_END_NAMESPACE
index 5d1c28b..bf96f03 100644 (file)
@@ -170,12 +170,18 @@ int QDeclarativeBoundSignal::qt_metacall(QMetaObject::Call c, int id, void **a)
     if (c == QMetaObject::InvokeMetaMethod && id == evaluateIdx) {
         if (!m_expression)
             return -1;
-        if (QDeclarativeDebugService::isDebuggingEnabled()) {
-            QDeclarativeProfilerService::startRange(QDeclarativeProfilerService::HandlingSignal);
-            QDeclarativeProfilerService::rangeData(QDeclarativeProfilerService::HandlingSignal, QLatin1String(m_signal.signature()) % QLatin1String(": ") % m_expression->expression());
-            QDeclarativeProfilerService::rangeLocation(QDeclarativeProfilerService::HandlingSignal, m_expression->sourceFile(), m_expression->lineNumber(), m_expression->columnNumber());
+
+        if (QDeclarativeDebugService::isDebuggingEnabled())
             QV8DebugService::instance()->signalEmitted(QString::fromAscii(m_signal.signature()));
+
+        QDeclarativeHandlingSignalProfiler prof;
+        if (prof.enabled) {
+            prof.setSignalInfo(QString::fromLatin1(m_signal.signature()),
+                               m_expression->expression());
+            prof.setLocation(m_expression->sourceFile(), m_expression->lineNumber(),
+                             m_expression->columnNumber());
         }
+
         m_isEvaluating = true;
         if (!m_paramsValid) {
             if (!m_signal.parameterTypes().isEmpty())
@@ -191,7 +197,6 @@ int QDeclarativeBoundSignal::qt_metacall(QMetaObject::Call c, int id, void **a)
         }
         if (m_params) m_params->clearValues();
         m_isEvaluating = false;
-        QDeclarativeProfilerService::endRange(QDeclarativeProfilerService::HandlingSignal);
         return -1;
     } else {
         return QObject::qt_metacall(c, id, a);
index c168c8f..57c3074 100644 (file)
@@ -739,14 +739,15 @@ QDeclarativeComponentPrivate::beginCreate(QDeclarativeContextData *context)
 
     QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(engine);
 
-    bool isRoot = enginePriv->inProgressCreations == 0;
+    if (enginePriv->inProgressCreations == 0) {
+        // only track root, since further ones might not be properly nested
+        profiler = new QDeclarativeObjectCreatingProfiler();
+    }
+
     enginePriv->inProgressCreations++;
     state.errors.clear();
     state.completePending = true;
 
-    if (isRoot) 
-        QDeclarativeProfilerService::startRange(QDeclarativeProfilerService::Creating);
-
     enginePriv->referenceScarceResources();
     state.vme.init(context, cc, start, creationContext);
     QObject *rv = state.vme.execute(&state.errors);
@@ -762,13 +763,12 @@ QDeclarativeComponentPrivate::beginCreate(QDeclarativeContextData *context)
         if (!context->isInternal)
             context->asQDeclarativeContextPrivate()->instances.append(rv);
         QDeclarativeEngineDebugService::instance()->objectCreated(engine, rv);
-        if (isRoot) {
-            QDeclarativeProfilerService::rangeData(QDeclarativeProfilerService::Creating,
-                                              buildTypeNameForDebug(rv->metaObject()));
+
+        if (profiler && profiler->enabled) {
+            profiler->setTypeName(buildTypeNameForDebug(rv->metaObject()));
             QDeclarativeData *data = QDeclarativeData::get(rv);
             Q_ASSERT(data);
-            QDeclarativeProfilerService::rangeLocation(QDeclarativeProfilerService::Creating,
-                                                  cc->url, data->lineNumber, data->columnNumber);
+            profiler->setLocation(cc->url, data->lineNumber, data->columnNumber);
         }
     }
 
@@ -824,7 +824,8 @@ void QDeclarativeComponentPrivate::completeCreate()
         QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
         complete(ep, &state);
 
-        QDeclarativeProfilerService::endRange(QDeclarativeProfilerService::Creating);
+        delete profiler;
+        profiler = 0;
     }
 }
 
index 2a23736..6824bd2 100644 (file)
@@ -62,6 +62,7 @@
 #include "qdeclarativevme_p.h"
 #include "qdeclarativeerror.h"
 #include "qdeclarative.h"
+#include "../debugger/qdeclarativeprofilerservice_p.h"
 
 #include <QtCore/QString>
 #include <QtCore/QStringList>
@@ -83,7 +84,7 @@ class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeComponentPrivate : public QObject
     Q_DECLARE_PUBLIC(QDeclarativeComponent)
         
 public:
-    QDeclarativeComponentPrivate() : typeData(0), progress(0.), start(-1), cc(0), engine(0), creationContext(0) {}
+    QDeclarativeComponentPrivate() : typeData(0), progress(0.), start(-1), cc(0), engine(0), creationContext(0), profiler(0) {}
 
     QObject *beginCreate(QDeclarativeContextData *);
     void completeCreate();
@@ -116,6 +117,7 @@ public:
 
     QDeclarativeEngine *engine;
     QDeclarativeGuardedContextData creationContext;
+    QDeclarativeObjectCreatingProfiler *profiler;
 
     void clear();
 
index dca0ef2..963bec5 100644 (file)
@@ -966,13 +966,13 @@ Q_AUTOTEST_EXPORT void qmlExecuteDeferred(QObject *object)
     QDeclarativeData *data = QDeclarativeData::get(object);
 
     if (data && data->deferredComponent) {
-        if (QDeclarativeDebugService::isDebuggingEnabled()) {
-            QDeclarativeProfilerService::startRange(QDeclarativeProfilerService::Creating);
+        QDeclarativeObjectCreatingProfiler prof;
+        if (prof.enabled) {
             QDeclarativeType *type = QDeclarativeMetaType::qmlType(object->metaObject());
-            QString typeName = type ? type->qmlTypeName() : QString::fromUtf8(object->metaObject()->className());
-            QDeclarativeProfilerService::rangeData(QDeclarativeProfilerService::Creating, typeName);
+            prof.setTypeName(type ? type->qmlTypeName()
+                                  : QString::fromUtf8(object->metaObject()->className()));
             if (data->outerContext)
-                QDeclarativeProfilerService::rangeLocation(QDeclarativeProfilerService::Creating, data->outerContext->url, data->lineNumber, data->columnNumber);
+                prof.setLocation(data->outerContext->url, data->lineNumber, data->columnNumber);
         }
         QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(data->context->engine);
 
@@ -983,7 +983,6 @@ Q_AUTOTEST_EXPORT void qmlExecuteDeferred(QObject *object)
         data->deferredComponent = 0;
 
         QDeclarativeComponentPrivate::complete(ep, &state);
-        QDeclarativeProfilerService::endRange(QDeclarativeProfilerService::Creating);
     }
 }
 
index a07e4fb..92dac18 100644 (file)
@@ -1578,13 +1578,12 @@ void QDeclarativeTypeData::downloadProgressChanged(qreal p)
 void QDeclarativeTypeData::compile()
 {
     Q_ASSERT(m_compiledData == 0);
-    QDeclarativeProfilerService::startRange(QDeclarativeProfilerService::Compiling);
 
     m_compiledData = new QDeclarativeCompiledData(typeLoader()->engine());
     m_compiledData->url = finalUrl();
     m_compiledData->name = finalUrlString();
-    QDeclarativeProfilerService::rangeLocation(QDeclarativeProfilerService::Compiling, m_compiledData->name,1,1);
-    QDeclarativeProfilerService::rangeData(QDeclarativeProfilerService::Compiling, m_compiledData->name);
+
+    QDeclarativeCompilingProfiler prof(m_compiledData->name);
 
     QDeclarativeCompiler compiler(&scriptParser._pool);
     if (!compiler.compile(typeLoader()->engine(), this, m_compiledData)) {
@@ -1592,7 +1591,6 @@ void QDeclarativeTypeData::compile()
         m_compiledData->release();
         m_compiledData = 0;
     }
-    QDeclarativeProfilerService::endRange(QDeclarativeProfilerService::Compiling);
 }
 
 void QDeclarativeTypeData::resolveTypes()