diff options
Diffstat (limited to 'src/declarative')
-rw-r--r-- | src/declarative/debugger/qdeclarativedebugtrace.cpp | 60 | ||||
-rw-r--r-- | src/declarative/debugger/qdeclarativedebugtrace_p.h | 19 | ||||
-rw-r--r-- | src/declarative/declarative.pro | 3 | ||||
-rw-r--r-- | src/declarative/qml/qperformancetimer.cpp | 38 | ||||
-rw-r--r-- | src/declarative/qml/qperformancetimer_p.h | 4 |
5 files changed, 120 insertions, 4 deletions
diff --git a/src/declarative/debugger/qdeclarativedebugtrace.cpp b/src/declarative/debugger/qdeclarativedebugtrace.cpp index 1c2d440..d4ede07 100644 --- a/src/declarative/debugger/qdeclarativedebugtrace.cpp +++ b/src/declarative/debugger/qdeclarativedebugtrace.cpp @@ -44,8 +44,68 @@ #include <QtCore/qdatastream.h> #include <QtCore/qurl.h> #include <QtCore/qtimer.h> +#include <QDebug> + +#ifdef CUSTOM_DECLARATIVE_DEBUG_TRACE_INSTANCE + +namespace { + + class GlobalInstanceDeleter + { + private: + QBasicAtomicPointer<QDeclarativeDebugTrace> &m_pointer; + public: + GlobalInstanceDeleter(QBasicAtomicPointer<QDeclarativeDebugTrace> &p) + : m_pointer(p) + {} + ~GlobalInstanceDeleter() + { + delete m_pointer; + m_pointer = 0; + } + }; + + QBasicAtomicPointer<QDeclarativeDebugTrace> s_globalInstance = Q_BASIC_ATOMIC_INITIALIZER(0); +} + + +static QDeclarativeDebugTrace *traceInstance() +{ + return QDeclarativeDebugTrace::globalInstance(); +} + +QDeclarativeDebugTrace *QDeclarativeDebugTrace::globalInstance() +{ + if (!s_globalInstance) { + // create default QDeclarativeDebugTrace instance if it is not explicitly set by setGlobalInstance(QDeclarativeDebugTrace *instance) + // thread safe implementation + QDeclarativeDebugTrace *x = new QDeclarativeDebugTrace(); + if (!s_globalInstance.testAndSetOrdered(0, x)) + delete x; + else + static GlobalInstanceDeleter cleanup(s_globalInstance); + } + return s_globalInstance; +} + +/*! + * Set custom QDeclarativeDebugTrace instance \a custom_instance. + * Function fails if QDeclarativeDebugTrace::globalInstance() was called before. + * QDeclarativeDebugTrace framework takes ownership of the custom instance. + */ +void QDeclarativeDebugTrace::setGlobalInstance(QDeclarativeDebugTrace *custom_instance) +{ + if (!s_globalInstance.testAndSetOrdered(0, custom_instance)) { + qWarning() << "QDeclarativeDebugTrace::setGlobalInstance() - instance already set."; + delete custom_instance; + } else { + static GlobalInstanceDeleter cleanup(s_globalInstance); + } +} +#else // CUSTOM_DECLARATIVE_DEBUG_TRACE_INSTANCE Q_GLOBAL_STATIC(QDeclarativeDebugTrace, traceInstance); +#endif // convert to a QByteArray that can be sent to the debug client // use of QDataStream can skew results if m_deferredSend == false diff --git a/src/declarative/debugger/qdeclarativedebugtrace_p.h b/src/declarative/debugger/qdeclarativedebugtrace_p.h index 5a077ac..ef5e618 100644 --- a/src/declarative/debugger/qdeclarativedebugtrace_p.h +++ b/src/declarative/debugger/qdeclarativedebugtrace_p.h @@ -44,6 +44,7 @@ #include <private/qdeclarativedebugservice_p.h> #include <private/qperformancetimer_p.h> +#include <QtCore/qglobal.h> QT_BEGIN_HEADER @@ -63,7 +64,7 @@ struct QDeclarativeDebugData }; class QUrl; -class Q_AUTOTEST_EXPORT QDeclarativeDebugTrace : public QDeclarativeDebugService +class Q_DECLARATIVE_EXPORT QDeclarativeDebugTrace : public QDeclarativeDebugService { public: enum Message { @@ -105,6 +106,21 @@ public: static void endRange(RangeType); QDeclarativeDebugTrace(); +#ifdef CUSTOM_DECLARATIVE_DEBUG_TRACE_INSTANCE +public: + static QDeclarativeDebugTrace* globalInstance(); + static void setGlobalInstance(QDeclarativeDebugTrace *custom_instance); +protected: + virtual void messageReceived(const QByteArray &); +protected: + virtual void addEventImpl(EventType); + virtual void startRangeImpl(RangeType); + virtual void rangeDataImpl(RangeType, const QString &); + virtual void rangeDataImpl(RangeType, const QUrl &); + virtual void rangeLocationImpl(RangeType, const QString &, int); + virtual void rangeLocationImpl(RangeType, const QUrl &, int); + virtual void endRangeImpl(RangeType); +#else protected: virtual void messageReceived(const QByteArray &); private: @@ -115,6 +131,7 @@ private: void rangeLocationImpl(RangeType, const QString &, int); void rangeLocationImpl(RangeType, const QUrl &, int); void endRangeImpl(RangeType); +#endif void processMessage(const QDeclarativeDebugData &); void sendMessages(); QPerformanceTimer m_timer; diff --git a/src/declarative/declarative.pro b/src/declarative/declarative.pro index 055e4b9..5bf4e01 100644 --- a/src/declarative/declarative.pro +++ b/src/declarative/declarative.pro @@ -41,3 +41,6 @@ linux-g++-maemo:DEFINES += QDECLARATIVEVIEW_NOBACKGROUND DEFINES += QT_NO_OPENTYPE INCLUDEPATH += ../3rdparty/harfbuzz/src +blackberry: { + DEFINES += CUSTOM_DECLARATIVE_DEBUG_TRACE_INSTANCE +} diff --git a/src/declarative/qml/qperformancetimer.cpp b/src/declarative/qml/qperformancetimer.cpp index fd70472..bee61fa 100644 --- a/src/declarative/qml/qperformancetimer.cpp +++ b/src/declarative/qml/qperformancetimer.cpp @@ -81,10 +81,18 @@ void QPerformanceTimer::start() qint64 QPerformanceTimer::elapsed() const { - uint64_t cpu_time = mach_absolute_time(); + qint64 cpu_time = mach_absolute_time(); return absoluteToNSecs(cpu_time - t1); } +// return number of nsecs elapsed from timer start time till absoluteMonotonicTimeNs +// elapsedToAbsoluteTime(0) returns negative value of absolute time (ns) when the timer was started +qint64 QPerformanceTimer::elapsedToAbsoluteTime(qint64 absoluteMonotonicTimeNs) const +{ + qint64 absolute_t1_ns = absoluteToNSecs(t1); + return absoluteMonotonicTimeNs - absolute_t1_ns; +} + ////////////////////////////// Symbian ////////////////////////////// #elif defined(Q_OS_SYMBIAN) @@ -108,6 +116,12 @@ qint64 QPerformanceTimer::elapsed() const } +qint64 QPerformanceTimer::elapsedToAbsoluteTime(qint64 absoluteMonotonicTimeNs) const +{ + qint64 absolute_t1_ns = getTimeFromTick(t1); + return absoluteMonotonicTimeNs - absolute_t1_ns; +} + ////////////////////////////// Unix ////////////////////////////// #elif defined(Q_OS_UNIX) @@ -182,6 +196,16 @@ qint64 QPerformanceTimer::elapsed() const return sec * Q_INT64_C(1000000000) + frac; } +qint64 QPerformanceTimer::elapsedToAbsoluteTime(qint64 absoluteMonotonicTimeNs) const +{ + qint64 sec = absoluteMonotonicTimeNs / Q_INT64_C(1000000000); + qint64 frac = absoluteMonotonicTimeNs % Q_INT64_C(1000000000); + sec = sec - t1; + frac = frac - t2; + + return sec * Q_INT64_C(1000000000) + frac; +} + ////////////////////////////// Windows ////////////////////////////// #elif defined(Q_OS_WIN) @@ -207,6 +231,12 @@ qint64 QPerformanceTimer::elapsed() const return getTimeFromTick(li.QuadPart - t1); } +qint64 QPerformanceTimer::elapsedToAbsoluteTime(qint64 absoluteMonotonicTimeNs) const +{ + qint64 absolute_t1_ns = getTimeFromTick(t1); + return absoluteMonotonicTimeNs - absolute_t1_ns; +} + ////////////////////////////// Default ////////////////////////////// #else @@ -220,6 +250,12 @@ qint64 QPerformanceTimer::elapsed() const return 0; } +qint64 QPerformanceTimer::elapsedToAbsoluteTime(qint64 absoluteMonotonicTimeNs) const +{ + Q_UNUSED(absoluteMonotonicTimeNs); + return 0; +} + #endif QT_END_NAMESPACE diff --git a/src/declarative/qml/qperformancetimer_p.h b/src/declarative/qml/qperformancetimer_p.h index cb39382..badba80 100644 --- a/src/declarative/qml/qperformancetimer_p.h +++ b/src/declarative/qml/qperformancetimer_p.h @@ -61,12 +61,12 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class Q_AUTOTEST_EXPORT QPerformanceTimer +class Q_DECLARATIVE_EXPORT QPerformanceTimer { public: void start(); qint64 elapsed() const; - + qint64 elapsedToAbsoluteTime(qint64 absoluteMonotonicTimeNs) const; private: qint64 t1; qint64 t2; |