Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmlprofilerclient.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
6
8
12
14{
15 int typeIndex = -1;
16 if (event.serverTypeId != 0) {
18
19 if (it != serverTypeIds.constEnd()) {
20 typeIndex = it.value();
21 } else {
24 serverTypeIds[event.serverTypeId] = typeIndex;
25 }
26 } else {
28
29 if (it != eventTypeIds.constEnd()) {
30 typeIndex = it.value();
31 } else {
34 eventTypeIds[event.type] = typeIndex;
35 }
36 }
37 return typeIndex;
38}
39
41{
43 return -1;
44
46 int typeIndex = typedEvent.event.typeIndex();
47 if (typeIndex >= 0)
48 return typeIndex;
49
50 typeIndex = resolveType(typedEvent);
51 typedEvent.event.setTypeIndex(typeIndex);
52 while (!pendingMessages.isEmpty()
53 && pendingMessages.head().timestamp() < typedEvent.event.timestamp()) {
55 }
56 forwardEvents(typedEvent.event);
57 return typeIndex;
58}
59
65
67{
69 && pendingDebugMessages.front().timestamp() <= untilTimestamp) {
71 }
72}
73
75{
76 // RangeData and RangeLocation always apply to the range on the top of the stack. Furthermore,
77 // all ranges are perfectly nested. This is why we can defer the type resolution until either
78 // the range ends or a child range starts. With only the information in RangeStart we wouldn't
79 // be able to uniquely identify the event type.
82 switch (rangeStage) {
83 case RangeStart:
86 break;
87 case RangeEnd: {
88 int typeIndex = resolveStackTop();
89 if (typeIndex == -1)
90 break;
92 while (!pendingMessages.isEmpty())
96 break;
97 }
98 case RangeData:
101 break;
102 case RangeLocation:
105 break;
106 case DebugMessage:
109 break;
110 default: {
111 int typeIndex = resolveType(currentEvent);
115 else
117 break;
118 }
119 }
120}
121
123{
126 stream << recording << engineId; // engineId -1 is OK. It means "all of them"
127 if (recording) {
129 stream << true; // yes, we support type IDs
130 }
131 q->sendMessage(stream.data());
132}
133
135 QQmlProfilerEventReceiver *eventReceiver,
136 quint64 features)
138{
140 setRequestedFeatures(features);
145 this, [d](int engineId) {
146 // We may already be done with that engine. Then we don't need to block it.
147 if (d->trackedEngines.contains(engineId))
148 d->engineControl->blockEngine(engineId);
149 });
151 d->engineControl.data(), [d](qint64 timestamp, const QList<int> &engineIds) {
152 Q_UNUSED(timestamp);
153 // The engines might not be blocked because the trace can get finished before engine control
154 // sees them.
155 for (int blocked : d->engineControl->blockedEngines()) {
156 if (engineIds.contains(blocked))
157 d->engineControl->releaseEngine(blocked);
158 }
159 });
160}
161
163{
164 //Disable profiling if started by client
165 //Profiling data will be lost!!
166 if (isRecording())
167 setRecording(false);
168}
169
171{
173 d->rangesInProgress.clear();
174 d->pendingMessages.clear();
175 d->pendingDebugMessages.clear();
176 if (d->recordedFeatures != 0) {
177 d->recordedFeatures = 0;
179 }
180 emit cleared();
181}
182
184{
186 d->serverTypeIds.clear();
187 d->eventTypeIds.clear();
188 d->trackedEngines.clear();
189 clearEvents();
190}
191
202
203
205{
207 d->sendRecordingStatus(engineId);
208}
209
211{
212 Q_D(const QQmlProfilerClient);
213 return d->recording;
214}
215
217{
219 if (v == d->recording)
220 return;
221
222 d->recording = v;
223
224 if (state() == Enabled)
226
228}
229
231{
232 Q_D(const QQmlProfilerClient);
233 return d->recordedFeatures;
234}
235
237{
239 d->requestedFeatures = features;
240 if (features & static_cast<quint64>(1) << ProfileDebugMessages) {
241 if (d->messageClient.isNull()) {
242 d->messageClient.reset(new QQmlDebugMessageClient(connection()));
243 connect(d->messageClient.data(), &QQmlDebugMessageClient::message, this,
244 [this](QtMsgType type, const QString &text, const QQmlDebugContextInfo &context)
245 {
246 Q_D(QQmlProfilerClient);
247 d->updateFeatures(ProfileDebugMessages);
248 d->currentEvent.event.setTimestamp(context.timestamp > 0 ? context.timestamp : 0);
249 d->currentEvent.event.setTypeIndex(-1);
250 d->currentEvent.event.setString(text);
251 d->currentEvent.type = QQmlProfilerEventType(
252 DebugMessage, MaximumRangeType, type,
253 QQmlProfilerEventLocation(context.file, context.line, 1));
254 d->currentEvent.serverTypeId = 0;
255 d->processCurrentEvent();
256 });
257 }
258 } else {
259 d->messageClient.reset();
260 }
261}
262
264{
266 d->flushInterval = flushInterval;
267}
268
276
278{
280 quint64 flag = 1ULL << feature;
281 if (!(requestedFeatures & flag))
282 return false;
283 if (!(recordedFeatures & flag)) {
284 recordedFeatures |= flag;
285 emit q->recordedFeaturesChanged(recordedFeatures);
286 }
287 return true;
288}
289
291{
292 if (status == Enabled) {
294 } else {
296 d->finalize();
297 }
298
299}
300
302{
304 QPacket stream(d->connection->currentDataStreamVersion(), data);
305
306 stream >> d->currentEvent;
307
308 d->maximumTime = qMax(d->currentEvent.event.timestamp(), d->maximumTime);
309 if (d->currentEvent.type.message() == Complete) {
310 d->finalize();
311 emit complete(d->maximumTime);
312 } else if (d->currentEvent.type.message() == Event
313 && d->currentEvent.type.detailType() == StartTrace) {
314 const QList<int> engineIds = d->currentEvent.event.numbers<QList<int>, qint32>();
315 d->trackedEngines.append(engineIds);
316 d->forwardDebugMessages(d->currentEvent.event.timestamp());
317 emit traceStarted(d->currentEvent.event.timestamp(), engineIds);
318 } else if (d->currentEvent.type.message() == Event
319 && d->currentEvent.type.detailType() == EndTrace) {
320 const QList<int> engineIds = d->currentEvent.event.numbers<QList<int>, qint32>();
321 for (int engineId : engineIds)
322 d->trackedEngines.removeAll(engineId);
323 d->forwardDebugMessages(d->currentEvent.event.timestamp());
324 emit traceFinished(d->currentEvent.event.timestamp(), engineIds);
325 } else if (d->updateFeatures(d->currentEvent.type.feature())) {
326 d->processCurrentEvent();
327 }
328}
329
331
332#include "moc_qqmlprofilerclient_p.cpp"
[custom type definition]
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
Definition qhash.h:1145
const_iterator constFind(const Key &key) const noexcept
Definition qhash.h:1299
const_iterator constEnd() const noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item after the ...
Definition qhash.h:1219
bool isEmpty() const noexcept
Definition qlist.h:401
reference front()
Definition qlist.h:687
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
The QPacket class encapsulates an unfragmentable packet of data to be transmitted by QPacketProtocol.
Definition qpacket_p.h:24
QPointer< QQmlDebugConnection > connection
void stateChanged(State state)
State state() const
QQmlDebugConnection * connection() const
Client for the debug message service.
void message(QtMsgType, const QString &, const QQmlDebugContextInfo &)
void engineAboutToBeRemoved(int engineId, const QString &name)
void engineAboutToBeAdded(int engineId, const QString &name)
QQmlProfilerTypedEvent currentEvent
QHash< QQmlProfilerEventType, int > eventTypeIds
QQueue< QQmlProfilerEvent > pendingDebugMessages
void forwardDebugMessages(qint64 untilTimestamp)
int resolveType(const QQmlProfilerTypedEvent &type)
QQmlProfilerEventReceiver * eventReceiver
void sendRecordingStatus(int engineId)
QStack< QQmlProfilerTypedEvent > rangesInProgress
bool updateFeatures(ProfileFeature feature)
void forwardEvents(const QQmlProfilerEvent &last)
QHash< qint64, int > serverTypeIds
QQueue< QQmlProfilerEvent > pendingMessages
void setFlushInterval(quint32 flushInterval)
QQmlProfilerClient(QQmlDebugConnection *connection, QQmlProfilerEventReceiver *eventReceiver, quint64 features=std::numeric_limits< quint64 >::max())
quint64 recordedFeatures() const
void traceFinished(qint64 timestamp, const QList< int > &engineIds)
void setRequestedFeatures(quint64 features)
void recordedFeaturesChanged(quint64 features)
void traceStarted(qint64 timestamp, const QList< int > &engineIds)
virtual void messageReceived(const QByteArray &) override
void recordingChanged(bool arg)
void onStateChanged(State status)
void sendRecordingStatus(int engineId=-1)
void complete(qint64 maximumTime)
virtual int numLoadedEventTypes() const =0
virtual void addEventType(const QQmlProfilerEventType &type)=0
virtual void addEvent(const QQmlProfilerEvent &event)=0
QQmlProfilerEventLocation location() const
void setLocation(const QQmlProfilerEventLocation &location)
void setData(const QString &data)
void enqueue(const T &t)
Adds value t to the tail of the queue.
Definition qqueue.h:18
T & head()
Returns a reference to the queue's head item.
Definition qqueue.h:20
T dequeue()
Removes the head item in the queue and returns it.
Definition qqueue.h:19
T & top()
Returns a reference to the stack's top item.
Definition qstack.h:19
T pop()
Removes the top item from the stack and returns it.
Definition qstack.h:18
void push(const T &t)
Adds element t to the top of the stack.
Definition qstack.h:17
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
QString text
QSet< QString >::iterator it
Combined button and popup list for selecting options.
static void * context
DBusConnection * connection
EGLStreamKHR stream
QtMsgType
Definition qlogging.h:29
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
GLsizei const GLfloat * v
[13]
GLuint GLuint GLuint requestedFeatures
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum type
struct _cl_event * event
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
#define emit
unsigned int quint32
Definition qtypes.h:50
int qint32
Definition qtypes.h:49
unsigned long long quint64
Definition qtypes.h:61
long long qint64
Definition qtypes.h:60
EventType type
Definition qwasmevent.h:136
Message rangeStage() const
void setTimestamp(qint64 timestamp)
void setRangeStage(Message stage)
qint64 timestamp() const
void setTypeIndex(int typeIndex)