1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2016 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the QtQml module of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:LGPL$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** GNU Lesser General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU Lesser 19 ** General Public License version 3 as published by the Free Software 20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the 21 ** packaging of this file. Please review the following information to 22 ** ensure the GNU Lesser General Public License version 3 requirements 23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 24 ** 25 ** GNU General Public License Usage 26 ** Alternatively, this file may be used under the terms of the GNU 27 ** General Public License version 2.0 or (at your option) the GNU General 28 ** Public license version 3 or any later version approved by the KDE Free 29 ** Qt Foundation. The licenses are as published by the Free Software 30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 31 ** included in the packaging of this file. Please review the following 32 ** information to ensure the GNU General Public License requirements will 33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and 34 ** https://www.gnu.org/licenses/gpl-3.0.html. 35 ** 36 ** $QT_END_LICENSE$ 37 ** 38 ****************************************************************************/ 39 40 #ifndef QQMLPROFILERSERVICE_P_H 41 #define QQMLPROFILERSERVICE_P_H 42 43 // 44 // W A R N I N G 45 // ------------- 46 // 47 // This file is not part of the Qt API. It exists purely as an 48 // implementation detail. This header file may change from version to 49 // version without notice, or even be removed. 50 // 51 // We mean it. 52 // 53 54 #include <private/qqmlconfigurabledebugservice_p.h> 55 #include <private/qqmldebugserviceinterfaces_p.h> 56 #include <private/qqmlprofilerdefinitions_p.h> 57 #include <private/qqmlabstractprofileradapter_p.h> 58 #include <private/qqmlboundsignal_p.h> 59 #include <private/qqmldebugconnector_p.h> 60 #include <private/qversionedpacket_p.h> 61 62 #include <QtCore/qelapsedtimer.h> 63 #include <QtCore/qmetaobject.h> 64 #include <QtCore/qmutex.h> 65 #include <QtCore/qvector.h> 66 #include <QtCore/qstringbuilder.h> 67 #include <QtCore/qwaitcondition.h> 68 #include <QtCore/qtimer.h> 69 70 #include <limits> 71 72 QT_BEGIN_NAMESPACE 73 74 class QUrl; 75 using QQmlDebugPacket = QVersionedPacket<QQmlDebugConnector>; 76 77 class QQmlProfilerServiceImpl : 78 public QQmlConfigurableDebugService<QQmlProfilerService>, 79 public QQmlProfilerDefinitions 80 { 81 Q_OBJECT 82 public: 83 84 void engineAboutToBeAdded(QJSEngine *engine) override; 85 void engineAboutToBeRemoved(QJSEngine *engine) override; 86 void engineAdded(QJSEngine *engine) override; 87 void engineRemoved(QJSEngine *engine) override; 88 89 void addGlobalProfiler(QQmlAbstractProfilerAdapter *profiler) override; 90 void removeGlobalProfiler(QQmlAbstractProfilerAdapter *profiler) override; 91 92 void startProfiling(QJSEngine *engine, 93 quint64 features = std::numeric_limits<quint64>::max()) override; 94 void stopProfiling(QJSEngine *engine) override; 95 96 QQmlProfilerServiceImpl(QObject *parent = 0); 97 ~QQmlProfilerServiceImpl() override; 98 99 void dataReady(QQmlAbstractProfilerAdapter *profiler) override; 100 101 signals: 102 void startFlushTimer(); 103 void stopFlushTimer(); 104 105 protected: 106 void stateAboutToBeChanged(State state) override; 107 void messageReceived(const QByteArray &) override; 108 109 private: 110 friend class QQmlProfilerServiceFactory; 111 112 void sendMessages(); 113 void addEngineProfiler(QQmlAbstractProfilerAdapter *profiler, QJSEngine *engine); 114 void removeProfilerFromStartTimes(const QQmlAbstractProfilerAdapter *profiler); 115 void flush(); 116 117 QElapsedTimer m_timer; 118 QTimer m_flushTimer; 119 bool m_waitingForStop; 120 121 bool m_globalEnabled; 122 quint64 m_globalFeatures; 123 124 QList<QQmlAbstractProfilerAdapter *> m_globalProfilers; 125 QMultiHash<QJSEngine *, QQmlAbstractProfilerAdapter *> m_engineProfilers; 126 QList<QJSEngine *> m_stoppingEngines; 127 QMultiMap<qint64, QQmlAbstractProfilerAdapter *> m_startTimes; 128 }; 129 130 QT_END_NAMESPACE 131 132 #endif // QQMLPROFILERSERVICE_P_H 133 134