18#include <QCoreApplication>
23using namespace Qt::StringLiterals;
29 QgsEventTracing::EventType type;
38static bool sIsTracing =
false;
47bool QgsEventTracing::startTracing()
53 sTraceEventsMutex()->lock();
54 sTracingTimer()->start();
55 sTraceEvents()->clear();
56 sTraceEvents()->reserve( 1000 );
57 sTraceEventsMutex()->unlock();
61bool QgsEventTracing::stopTracing()
67 sTracingTimer()->invalidate();
71bool QgsEventTracing::isTracingEnabled()
76static char _eventTypeToChar( QgsEventTracing::EventType type )
80 case QgsEventTracing::Begin:
return 'B';
81 case QgsEventTracing::End:
return 'E';
82 case QgsEventTracing::Instant:
return 'i';
83 case QgsEventTracing::AsyncBegin:
return 'b';
84 case QgsEventTracing::AsyncEnd:
return 'e';
89bool QgsEventTracing::writeTrace(
const QString &fileName )
95 if ( !f.open( QIODevice::WriteOnly ) )
98 f.write(
"{\n\"traceEvents\": [\n" );
101 for (
const auto &item : *sTraceEvents() )
107 const char t = _eventTypeToChar( item.type );
108 QString msg = u
" {\"cat\": \"%1\", \"pid\": 1, \"tid\": %2, \"ts\": %3, \"ph\": \"%4\", \"name\": \"%5\""_s
109 .arg( item.category ).arg( item.threadId ).arg( item.timestamp ).arg( t ).arg( item.name );
112 if ( item.type == Instant )
113 msg +=
", \"s\": \"g\""_L1;
116 if ( item.type == AsyncBegin || item.type == AsyncEnd )
117 msg += u
", \"id\": \"%1\""_s.arg( item.id );
121 f.write( msg.toUtf8() );
124 f.write(
"\n]\n}\n" );
129void QgsEventTracing::addEvent( QgsEventTracing::EventType type,
const QString &category,
const QString &name,
const QString &
id )
134 sTraceEventsMutex()->lock();
137 item.timestamp = sTracingTimer()->nsecsElapsed() / 1000;
138 if ( QThread::currentThread() == QCoreApplication::instance()->thread() )
141 item.threadId =
static_cast<uint
>(
reinterpret_cast<quint64
>( QThread::currentThreadId() ) );
142 item.category = category;
145 sTraceEvents()->append( item );
146 sTraceEventsMutex()->unlock();
Q_GLOBAL_STATIC(QReadWriteLock, sDefinitionCacheLock)