Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qctf_p.h
Go to the documentation of this file.
1// Copyright (C) 2022 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// Qt-Security score:significant reason:default
4
5#ifndef Q_CTF_H
6#define Q_CTF_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18//
19
20#include <qtcoreexports.h>
21#include <qobject.h>
22
24
25struct QCtfTraceMetadata;
26struct Q_CORE_EXPORT QCtfTracePointProvider
27{
28 const QString provider;
29 QCtfTraceMetadata *metadata;
30 QCtfTracePointProvider(const QString &provider)
31 : provider(provider), metadata(nullptr)
32 {
33
34 }
35};
36
37struct Q_CORE_EXPORT QCtfTraceMetadata
38{
39 const QString name;
40 const QString metadata;
41 QCtfTraceMetadata(QCtfTracePointProvider &provider, const QString &name, const QString &metadata)
42 : name(name), metadata(metadata)
43 {
44 next = provider.metadata;
45 provider.metadata = this;
46 }
47 QCtfTraceMetadata *next = nullptr;
48};
49
51struct Q_CORE_EXPORT QCtfTracePointEvent
52{
53 const QCtfTracePointProvider &provider;
54 const QString eventName;
55 const QString metadata;
56 const int size;
57 const bool variableSize;
58
59 QCtfTracePointEvent(const QCtfTracePointProvider &provider, const QString &name, const QString &metadata, int size, bool variableSize)
60 : provider(provider), eventName(name), metadata(metadata), size(size), variableSize(variableSize)
61 {
62 }
63 QCtfTracePointPrivate *d = nullptr;
64};
65
66
67
68Q_CORE_EXPORT bool _tracepoint_enabled(const QCtfTracePointEvent &point);
69Q_CORE_EXPORT void _do_tracepoint(const QCtfTracePointEvent &point, const QByteArray &arr);
70Q_CORE_EXPORT QCtfTracePointPrivate *_initialize_tracepoint(const QCtfTracePointEvent &point);
71
72#ifndef BUILD_LIBRARY
73#include <QtCore/qbytearray.h>
74#include <QtCore/qstring.h>
75#include <QtCore/qurl.h>
76namespace trace {
77inline void toByteArray(QByteArray &)
78{
79}
80
81inline void toByteArray(QByteArray &arr, const QString &value)
82{
83 arr.append(value.toUtf8());
84 arr.append((char)0);
85}
86
87inline void toByteArray(QByteArray &arr, const QUrl &value)
88{
89 arr.append(value.toString().toUtf8());
90 arr.append((char)0);
91}
92
93inline void toByteArray(QByteArray &arr, const QByteArray &data)
94{
95 arr.append(data);
96}
97
98template <typename T>
99inline void toByteArray(QByteArray &arr, T value)
100{
101 arr.append((char *)&value, sizeof(value));
102}
103
104template <typename T, typename... Ts>
105inline void toByteArray(QByteArray &arr, T value, Ts... args)
106{
107 toByteArray(arr, value);
108 toByteArray(arr, args...);
109}
110
111inline QByteArray toByteArray()
112{
113 return {};
114}
115
116template <typename... Ts>
117inline QByteArray toByteArray(Ts... args)
118{
119 QByteArray data;
120 toByteArray(data, args...);
121 return data;
122}
123
124template <typename T>
125inline QByteArray toByteArrayFromArray(const T *values, int arraySize)
126{
127 QByteArray data;
128 data.append((char *)values, arraySize * sizeof(T));
129 return data;
130}
131
132template <typename IntegerType, typename T>
133inline QByteArray toByteArrayFromEnum(T value)
134{
135 IntegerType e = static_cast<IntegerType>(value);
136 QByteArray data;
137 data.append((char *)&e, sizeof(e));
138 return data;
139}
140
141inline QByteArray toByteArrayFromCString(const char *str)
142{
143 QByteArray data;
144 if (str && *str != 0)
145 data.append(str);
146 data.append((char)0);
147 return data;
148}
149
150static inline void appendFlags(QByteArray &data, quint8 &count, quint32 value)
151{
152 count = 0;
153 quint8 d = 1;
154 while (value) {
155 if (value&1) {
156 data.append(d);
157 count++;
158 }
159 d++;
160 value >>= 1;
161 }
162}
163
164template <typename T>
165inline QByteArray toByteArrayFromFlags(QFlags<T> value)
166{
167 quint32 intValue = static_cast<quint32>(value.toInt());
168 quint8 count;
169 QByteArray data;
170 data.append((char)0);
171 if (intValue == 0) {
172 data.append((char)0);
173 data.data()[0] = 1;
174 } else {
175 appendFlags(data, count, intValue);
176 data.data()[0] = count;
177 }
178 return data;
179}
180
181} // trace
182
183#define _DEFINE_EVENT(provider, event, metadata, size, varSize)
184 static QCtfTracePointEvent _ctf_ ## event = QCtfTracePointEvent(_ctf_provider_ ## provider, QStringLiteral(QT_STRINGIFY(event)), metadata, size, varSize);
185#define _DEFINE_METADATA(provider, name, metadata)
186 static QCtfTraceMetadata _ctf_metadata_ ## name = QCtfTraceMetadata(_ctf_provider_ ## provider, QStringLiteral(QT_STRINGIFY(name)), metadata);
187#define _DEFINE_TRACEPOINT_PROVIDER(provider)
188 static QCtfTracePointProvider _ctf_provider_ ## provider = QCtfTracePointProvider(QStringLiteral(QT_STRINGIFY(provider)));
189
190#define TRACEPOINT_EVENT(provider, event, metadata, size, varSize)
191 _DEFINE_EVENT(provider, event, metadata, size, varSize)
192
193#define TRACEPOINT_PROVIDER(provider)
194 _DEFINE_TRACEPOINT_PROVIDER(provider)
195
196#define TRACEPOINT_METADATA(provider, name, metadata)
197 _DEFINE_METADATA(provider, name, metadata)
198
199#define tracepoint_enabled(provider, event)
200 _tracepoint_enabled(_ctf_ ## event)
201
202#define do_tracepoint(provider, event, ...) \
203{
204 auto &tp = _ctf_ ## event;
205 if (!tp.d)
206 tp.d = _initialize_tracepoint(tp);
207 if (tp.d) {
208 QByteArray data(tp.size, 0);
209 if (!tp.metadata.isEmpty())
210 data = trace::toByteArray(__VA_ARGS__);
211 _do_tracepoint(tp, data);
212 } \
213}
214
215#define tracepoint(provider, name, ...)
216 do {
217 if (tracepoint_enabled(provider, name))
218 do_tracepoint(provider, name, __VA_ARGS__);
219 } while (0)
220
221#endif
222
223class Q_CORE_EXPORT QCtfLib : public QObject
224{
225 Q_OBJECT
226 Q_DISABLE_COPY(QCtfLib)
227public:
228 explicit QCtfLib(QObject *parent = nullptr) : QObject(parent) {}
229 virtual ~QCtfLib() = default;
230 virtual bool tracepointEnabled(const QCtfTracePointEvent &point) = 0;
231 virtual void doTracepoint(const QCtfTracePointEvent &point, const QByteArray &arr) = 0;
232 virtual bool sessionEnabled() = 0;
233 virtual QCtfTracePointPrivate *initializeTracepoint(const QCtfTracePointEvent &point) = 0;
234 virtual void shutdown(bool *shutdown) = 0;
235};
236
237QT_END_NAMESPACE
238
239#endif
Combined button and popup list for selecting options.
static bool s_prevent_recursion
Definition qctf.cpp:22
#define BUILD_LIBRARY
Definition qctf.cpp:5
bool _tracepoint_enabled(const QCtfTracePointEvent &point)
Definition qctf.cpp:122
static QCtfLib * s_plugin
Definition qctf.cpp:24
void _do_tracepoint(const QCtfTracePointEvent &point, const QByteArray &arr)
Definition qctf.cpp:129
static bool s_shutdown
Definition qctf.cpp:23
static bool loadPlugin(bool &retry)
Definition qctf.cpp:76
static bool s_initialized
Definition qctf.cpp:20
QCtfTracePointPrivate * _initialize_tracepoint(const QCtfTracePointEvent &point)
Definition qctf.cpp:137
static bool s_triedLoading
Definition qctf.cpp:21
#define QCtfPluginIID
Definition qctf.cpp:74
static bool initialize()
Definition qctf.cpp:96