19#include <qtcoreexports.h>
24struct QCtfTraceMetadata;
27 const QString provider;
28 QCtfTraceMetadata *metadata;
29 QCtfTracePointProvider(
const QString &provider)
30 : provider(provider), metadata(
nullptr)
39 const QString metadata;
40 QCtfTraceMetadata(QCtfTracePointProvider &provider,
const QString &name,
const QString &metadata)
41 : name(name), metadata(metadata)
43 next = provider.metadata;
44 provider.metadata =
this;
46 QCtfTraceMetadata *next =
nullptr;
52 const QCtfTracePointProvider &provider;
53 const QString eventName;
54 const QString metadata;
56 const bool variableSize;
58 QCtfTracePointEvent(
const QCtfTracePointProvider &provider,
const QString &name,
const QString &metadata,
int size,
bool variableSize)
59 : provider(provider), eventName(name), metadata(metadata), size(size), variableSize(variableSize)
62 QCtfTracePointPrivate *d =
nullptr;
69Q_CORE_EXPORT QCtfTracePointPrivate *_initialize_tracepoint(
const QCtfTracePointEvent &point);
72#include <QtCore/qbytearray.h>
73#include <QtCore/qstring.h>
74#include <QtCore/qurl.h>
76inline void toByteArray(QByteArray &)
80inline void toByteArray(QByteArray &arr,
const QString &value)
82 arr.append(value.toUtf8());
86inline void toByteArray(QByteArray &arr,
const QUrl &value)
88 arr.append(value.toString().toUtf8());
92inline void toByteArray(QByteArray &arr,
const QByteArray &data)
98inline void toByteArray(QByteArray &arr, T value)
100 arr.append((
char *)&value,
sizeof(value));
103template <
typename T,
typename... Ts>
104inline void toByteArray(QByteArray &arr, T value, Ts... args)
106 toByteArray(arr, value);
107 toByteArray(arr, args...);
110inline QByteArray toByteArray()
115template <
typename... Ts>
116inline QByteArray toByteArray(Ts... args)
119 toByteArray(data, args...);
124inline QByteArray toByteArrayFromArray(
const T *values,
int arraySize)
127 data.append((
char *)values, arraySize *
sizeof(T));
131template <
typename IntegerType,
typename T>
132inline QByteArray toByteArrayFromEnum(T value)
134 IntegerType e =
static_cast<IntegerType>(value);
136 data.append((
char *)&e,
sizeof(e));
140inline QByteArray toByteArrayFromCString(
const char *str)
143 if (str && *str != 0)
145 data.append((
char)0);
149static inline void appendFlags(QByteArray &data, quint8 &count, quint32 value)
164inline QByteArray toByteArrayFromFlags(QFlags<T> value)
166 quint32 intValue =
static_cast<quint32>(value.toInt());
169 data.append((
char)0);
171 data.append((
char)0);
174 appendFlags(data, count, intValue);
175 data.data()[0] = count;
182#define _DEFINE_EVENT(provider, event, metadata, size, varSize)
183 static QCtfTracePointEvent _ctf_ ## event = QCtfTracePointEvent(_ctf_provider_ ## provider, QStringLiteral(QT_STRINGIFY(event)), metadata, size, varSize);
184#define _DEFINE_METADATA(provider, name, metadata)
185 static QCtfTraceMetadata _ctf_metadata_ ## name = QCtfTraceMetadata(_ctf_provider_ ## provider, QStringLiteral(QT_STRINGIFY(name)), metadata);
186#define _DEFINE_TRACEPOINT_PROVIDER(provider)
187 static QCtfTracePointProvider _ctf_provider_ ## provider = QCtfTracePointProvider(QStringLiteral(QT_STRINGIFY(provider)));
189#define TRACEPOINT_EVENT(provider, event, metadata, size, varSize)
190 _DEFINE_EVENT(provider, event, metadata, size, varSize)
192#define TRACEPOINT_PROVIDER(provider)
193 _DEFINE_TRACEPOINT_PROVIDER(provider)
195#define TRACEPOINT_METADATA(provider, name, metadata)
196 _DEFINE_METADATA(provider, name, metadata)
198#define tracepoint_enabled(provider, event)
199 _tracepoint_enabled(_ctf_ ## event)
201#define do_tracepoint(provider, event, ...) \
202{
203 auto &tp = _ctf_ ## event;
205 tp.d = _initialize_tracepoint(tp);
207 QByteArray data(tp.size, 0
);
208 if (!tp.metadata.isEmpty())
209 data = trace::toByteArray(__VA_ARGS__);
210 _do_tracepoint(tp, data);
212}
214#define tracepoint(provider, name, ...)
216 if (tracepoint_enabled(provider, name))
217 do_tracepoint(provider, name, __VA_ARGS__);
225 Q_DISABLE_COPY(QCtfLib)
227 explicit QCtfLib(QObject *parent =
nullptr) : QObject(parent) {}
228 virtual ~QCtfLib() =
default;
229 virtual bool tracepointEnabled(
const QCtfTracePointEvent &point) = 0;
230 virtual void doTracepoint(
const QCtfTracePointEvent &point,
const QByteArray &arr) = 0;
231 virtual bool sessionEnabled() = 0;
232 virtual QCtfTracePointPrivate *initializeTracepoint(
const QCtfTracePointEvent &point) = 0;
233 virtual void shutdown(
bool *shutdown) = 0;
static bool s_prevent_recursion
bool _tracepoint_enabled(const QCtfTracePointEvent &point)
static QCtfLib * s_plugin
void _do_tracepoint(const QCtfTracePointEvent &point, const QByteArray &arr)
static bool loadPlugin(bool &retry)
static bool s_initialized
QCtfTracePointPrivate * _initialize_tracepoint(const QCtfTracePointEvent &point)
static bool s_triedLoading