18#include <QCoreApplication>
23using namespace Qt::StringLiterals;
27using namespace Qt::StringLiterals;
31 QgsEventTracing::EventType type;
40static bool sIsTracing =
false;
49bool QgsEventTracing::startTracing()
55 sTraceEventsMutex()->lock();
56 sTracingTimer()->start();
57 sTraceEvents()->clear();
58 sTraceEvents()->reserve( 1000 );
59 sTraceEventsMutex()->unlock();
63bool QgsEventTracing::stopTracing()
69 sTracingTimer()->invalidate();
73bool QgsEventTracing::isTracingEnabled()
78static char _eventTypeToChar( QgsEventTracing::EventType type )
82 case QgsEventTracing::Begin:
84 case QgsEventTracing::End:
86 case QgsEventTracing::Instant:
88 case QgsEventTracing::AsyncBegin:
90 case QgsEventTracing::AsyncEnd:
96bool QgsEventTracing::writeTrace(
const QString &fileName )
102 if ( !f.open( QIODevice::WriteOnly ) )
105 f.write(
"{\n\"traceEvents\": [\n" );
108 for (
const auto &item : *sTraceEvents() )
114 const char t = _eventTypeToChar( item.type );
115 QString msg = u
" {\"cat\": \"%1\", \"pid\": 1, \"tid\": %2, \"ts\": %3, \"ph\": \"%4\", \"name\": \"%5\""_s.arg( item.category ).arg( item.threadId ).arg( item.timestamp ).arg( t ).arg( item.name );
118 if ( item.type == Instant )
119 msg +=
", \"s\": \"g\""_L1;
122 if ( item.type == AsyncBegin || item.type == AsyncEnd )
123 msg += u
", \"id\": \"%1\""_s.arg( item.id );
127 f.write( msg.toUtf8() );
130 f.write(
"\n]\n}\n" );
135void QgsEventTracing::addEvent( QgsEventTracing::EventType type,
const QString &category,
const QString &name,
const QString &
id )
140 sTraceEventsMutex()->lock();
143 item.timestamp = sTracingTimer()->nsecsElapsed() / 1000;
144 if ( QThread::currentThread() == QCoreApplication::instance()->thread() )
147 item.threadId =
static_cast<uint
>(
reinterpret_cast<quint64
>( QThread::currentThreadId() ) );
148 item.category = category;
151 sTraceEvents()->append( item );
152 sTraceEventsMutex()->unlock();
Q_GLOBAL_STATIC(QReadWriteLock, sDefinitionCacheLock)