18#include <QCoreApplication> 
   26  QgsEventTracing::EventType type;
 
   35static bool sIsTracing = 
false;
 
   44bool QgsEventTracing::startTracing()
 
   50  sTraceEventsMutex()->lock();
 
   51  sTracingTimer()->start();
 
   52  sTraceEvents()->clear();
 
   53  sTraceEvents()->reserve( 1000 );
 
   54  sTraceEventsMutex()->unlock();
 
   58bool QgsEventTracing::stopTracing()
 
   64  sTracingTimer()->invalidate();
 
   68bool QgsEventTracing::isTracingEnabled()
 
   73static char _eventTypeToChar( QgsEventTracing::EventType type )
 
   77    case QgsEventTracing::Begin: 
return 'B';
 
   78    case QgsEventTracing::End: 
return 'E';
 
   79    case QgsEventTracing::Instant: 
return 'i';
 
   80    case QgsEventTracing::AsyncBegin: 
return 'b';
 
   81    case QgsEventTracing::AsyncEnd: 
return 'e';
 
   86bool QgsEventTracing::writeTrace( 
const QString &fileName )
 
   92  if ( !f.open( QIODevice::WriteOnly ) )
 
   95  f.write( 
"{\n\"traceEvents\": [\n" );
 
   98  for ( 
const auto &item : *sTraceEvents() )
 
  104    const char t = _eventTypeToChar( item.type );
 
  105    QString msg = QStringLiteral( 
"  {\"cat\": \"%1\", \"pid\": 1, \"tid\": %2, \"ts\": %3, \"ph\": \"%4\", \"name\": \"%5\"" )
 
  106                  .arg( item.category ).arg( item.threadId ).arg( item.timestamp ).arg( t ).arg( item.name );
 
  109    if ( item.type == Instant )
 
  110      msg += QLatin1String( 
", \"s\": \"g\"" );
 
  113    if ( item.type == AsyncBegin || item.type == AsyncEnd )
 
  114      msg += QStringLiteral( 
", \"id\": \"%1\"" ).arg( item.id );
 
  118    f.write( msg.toUtf8() );
 
  121  f.write( 
"\n]\n}\n" );
 
  126void QgsEventTracing::addEvent( QgsEventTracing::EventType type, 
const QString &category, 
const QString &name, 
const QString &
id )
 
  131  sTraceEventsMutex()->lock();
 
  134  item.timestamp = sTracingTimer()->nsecsElapsed() / 1000;
 
  135  if ( QThread::currentThread() == QCoreApplication::instance()->thread() )
 
  138    item.threadId = 
static_cast<uint
>( 
reinterpret_cast<quint64
>( QThread::currentThreadId() ) );
 
  139  item.category = category;
 
  142  sTraceEvents()->append( item );
 
  143  sTraceEventsMutex()->unlock();
 
Q_GLOBAL_STATIC(QReadWriteLock, sDefinitionCacheLock)