4#include <private/qhitrace_p.h>
5#include <private/qtools_p.h>
7#include <QtCore/qlogging.h>
9#include <hitrace/trace.h>
32Q_CONSTINIT int32_t qtHiTraceListener = unregisteredListener;
36 return unit == u',' || unit == u'=' || unit == u'|';
47 switch (unit.unicode()) {
67 if (isWrittenVerbatim(unit))
69 return shortEscape(unit) ? shortEscapeSize : unicodeEscapeSize;
75 result.reserve(text.size());
76 for (
const QChar unit : text) {
77 if (isSeparator(unit)) {
78 result += separatorReplacement;
81 if (isWrittenVerbatim(unit)) {
82 result +=
char(unit.unicode());
86 if (
const char shortForm = shortEscape(unit)) {
90 result += unicodeEscape;
91 for (
int digit = escapeDigits - 1; digit >= 0; --digit)
92 result += QtMiscUtils::toHexLower(unit.unicode() >> (digit * bitsPerHexDigit));
103template <
typename Iterator>
106 constexpr bool isReversed = std::is_same_v<Iterator, QStringView::const_reverse_iterator>;
109 const QChar high = isReversed ? unit[1] : unit[0];
110 const QChar low = isReversed ? unit[0] : unit[1];
111 return high.isHighSurrogate() && low.isLowSurrogate();
114template <
typename Iterator>
118 while (unit != end) {
119 const qsizetype step = startsSurrogatePair(unit, end) ? 2 : 1;
120 qsizetype stepSize = escapedSize(unit[0]);
122 stepSize += escapedSize(unit[1]);
123 if (fitting.escapedSize + stepSize > maximumSize)
125 fitting.escapedSize += stepSize;
126 fitting.count += step;
134 Q_ASSERT(maximumSize >= qtHiTraceSmallestValueBudget);
136 if (fittingUnits(value.cbegin(), value.cend(), maximumSize).count == value.size())
137 return escaped(value);
139 const qsizetype kept = maximumSize - (qsizetype(
sizeof(
elidedMark)) - 1);
140 const FittingUnits head = fittingUnits(value.cbegin(), value.cend(), kept / 2);
142 fittingUnits(value.crbegin(), value.crend(), kept - head.escapedSize);
143 return escaped(value.first(head.count)) + elidedMark + escaped(value.last(tail.count));
148 qtHiTraceEnabled.storeRelaxed(enabled);
155 qtHiTraceEnabled.storeRelaxed(
true);
156 qWarning(
"Qt tracing: OH_HiTrace_RegisterTraceListener() failed with %d, so tracepoint "
157 "arguments are rendered whether or not a capture is running",
162 qtHiTraceListener = listener;
163 if (OH_HiTrace_IsTraceEnabled())
164 qtHiTraceEnabled.storeRelaxed(
true);
169 if (qtHiTraceListener != unregisteredListener)
170 OH_HiTrace_UnregisterTraceListener(qtHiTraceListener);
177 return elided(QString::fromUtf8(value), maximumSize);
182 return elided(value, maximumSize);
187 Q_CONSTINIT
static thread_local char renderedArguments[qtHiTraceRecordBudget] = {};
189 const int budget = qtHiTraceRecordBudget - sliceNameSize;
194 va_start(values, format);
195 const int renderedSize = std::vsnprintf(renderedArguments, budget, format, values);
198 if (renderedSize < 0)
200 if (renderedSize >= budget) {
204 return renderedArguments;
207Q_CONSTINIT QBasicAtomicInteger<
bool> qtHiTraceEnabled = Q_BASIC_ATOMIC_INITIALIZER(
false);
209Q_CONSTRUCTOR_FUNCTION(qtHiTraceWatchStatus)
210Q_DESTRUCTOR_FUNCTION(qtHiTraceUnwatchStatus)
constexpr int bitsPerHexDigit
bool startsSurrogatePair(Iterator unit, Iterator end)
constexpr char16_t firstPrintable
constexpr char separatorReplacement
QByteArray elided(QStringView value, qsizetype maximumSize)
constexpr char unicodeEscape
char shortEscape(QChar unit)
FittingUnits fittingUnits(Iterator unit, Iterator end, qsizetype maximumSize)
bool isSeparator(QChar unit)
void qtHiTraceUnwatchStatus()
void qtHiTraceWatchStatus()
qsizetype escapedSize(QChar unit)
QByteArray escaped(QStringView text)
constexpr int32_t unregisteredListener
constexpr qsizetype shortEscapeSize
void qtHiTraceStatusChanged(bool enabled)
constexpr char16_t lastPrintable
bool isWrittenVerbatim(QChar unit)
constexpr char escapeMark
constexpr char elidedMark[]
constexpr int escapeDigits
constexpr qsizetype unicodeEscapeSize
QByteArray qtHiTraceArgument(const char *value, qsizetype maximumSize)
const char * qtHiTraceFormatArguments(int sliceNameSize, const char *format,...)
QByteArray qtHiTraceArgument(const QString &value, qsizetype maximumSize)