20#include <qtcoreexports.h>
25struct QCtfTraceMetadata;
28 const QString provider;
29 QCtfTraceMetadata *metadata;
30 QCtfTracePointProvider(
const QString &provider)
31 : provider(provider), metadata(
nullptr)
40 const QString metadata;
41 QCtfTraceMetadata(QCtfTracePointProvider &provider,
const QString &name,
const QString &metadata)
42 : name(name), metadata(metadata)
44 next = provider.metadata;
45 provider.metadata =
this;
47 QCtfTraceMetadata *next =
nullptr;
53 const QCtfTracePointProvider &provider;
54 const QString eventName;
55 const QString metadata;
57 const bool variableSize;
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)
63 QCtfTracePointPrivate *d =
nullptr;
70Q_CORE_EXPORT QCtfTracePointPrivate *_initialize_tracepoint(
const QCtfTracePointEvent &point);
73#include <QtCore/qbytearray.h>
74#include <QtCore/qstring.h>
75#include <QtCore/qurl.h>
77inline void toByteArray(QByteArray &)
81inline void toByteArray(QByteArray &arr,
const QString &value)
83 arr.append(value.toUtf8());
87inline void toByteArray(QByteArray &arr,
const QUrl &value)
89 arr.append(value.toString().toUtf8());
93inline void toByteArray(QByteArray &arr,
const QByteArray &data)
99inline void toByteArray(QByteArray &arr, T value)
101 arr.append((
char *)&value,
sizeof(value));
104template <
typename T,
typename... Ts>
105inline void toByteArray(QByteArray &arr, T value, Ts... args)
107 toByteArray(arr, value);
108 toByteArray(arr, args...);
111inline QByteArray toByteArray()
116template <
typename... Ts>
117inline QByteArray toByteArray(Ts... args)
120 toByteArray(data, args...);
125inline QByteArray toByteArrayFromArray(
const T *values,
int arraySize)
128 data.append((
char *)values, arraySize *
sizeof(T));
132template <
typename IntegerType,
typename T>
133inline QByteArray toByteArrayFromEnum(T value)
135 IntegerType e =
static_cast<IntegerType>(value);
137 data.append((
char *)&e,
sizeof(e));
141inline QByteArray toByteArrayFromCString(
const char *str)
144 if (str && *str != 0)
146 data.append((
char)0);
150static inline void appendFlags(QByteArray &data, quint8 &count, quint32 value)
165inline QByteArray toByteArrayFromFlags(QFlags<T> value)
167 quint32 intValue =
static_cast<quint32>(value.toInt());
170 data.append((
char)0);
172 data.append((
char)0);
175 appendFlags(data, count, intValue);
176 data.data()[0] = count;
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)));
190#define TRACEPOINT_EVENT(provider, event, metadata, size, varSize)
191 _DEFINE_EVENT(provider, event, metadata, size, varSize)
193#define TRACEPOINT_PROVIDER(provider)
194 _DEFINE_TRACEPOINT_PROVIDER(provider)
196#define TRACEPOINT_METADATA(provider, name, metadata)
197 _DEFINE_METADATA(provider, name, metadata)
199#define tracepoint_enabled(provider, event)
200 _tracepoint_enabled(_ctf_ ## event)
202#define do_tracepoint(provider, event, ...) \
203{
204 auto &tp = _ctf_ ## event;
206 tp.d = _initialize_tracepoint(tp);
208 QByteArray data(tp.size, 0
);
209 if (!tp.metadata.isEmpty())
210 data = trace::toByteArray(__VA_ARGS__);
211 _do_tracepoint(tp, data);
213}
215#define tracepoint(provider, name, ...)
217 if (tracepoint_enabled(provider, name))
218 do_tracepoint(provider, name, __VA_ARGS__);
226 Q_DISABLE_COPY(QCtfLib)
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;
Combined button and popup list for selecting options.
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