mirror of
https://github.com/wolfpld/tracy
synced 2025-04-29 20:33:52 +00:00
Extract symbol queue item handling.
This commit is contained in:
parent
2b9265cc40
commit
02ce9b7d8b
@ -3047,6 +3047,77 @@ void Profiler::QueueExternalName( uint64_t ptr )
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TRACY_HAS_CALLSTACK
|
#ifdef TRACY_HAS_CALLSTACK
|
||||||
|
void Profiler::HandleSymbolQueueItem( const SymbolQueueItem& si )
|
||||||
|
{
|
||||||
|
switch( si.type )
|
||||||
|
{
|
||||||
|
case SymbolQueueItemType::CallstackFrame:
|
||||||
|
{
|
||||||
|
const auto frameData = DecodeCallstackPtr( si.ptr );
|
||||||
|
auto data = tracy_malloc_fast( sizeof( CallstackEntry ) * frameData.size );
|
||||||
|
memcpy( data, frameData.data, sizeof( CallstackEntry ) * frameData.size );
|
||||||
|
TracyLfqPrepare( QueueType::CallstackFrameSize );
|
||||||
|
MemWrite( &item->callstackFrameSizeFat.ptr, si.ptr );
|
||||||
|
MemWrite( &item->callstackFrameSizeFat.size, frameData.size );
|
||||||
|
MemWrite( &item->callstackFrameSizeFat.data, (uint64_t)data );
|
||||||
|
MemWrite( &item->callstackFrameSizeFat.imageName, (uint64_t)frameData.imageName );
|
||||||
|
TracyLfqCommit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SymbolQueueItemType::SymbolQuery:
|
||||||
|
{
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
// On Android it's common for code to be in mappings that are only executable
|
||||||
|
// but not readable.
|
||||||
|
if( !EnsureReadable( si.ptr ) )
|
||||||
|
{
|
||||||
|
TracyLfqPrepare( QueueType::AckServerQueryNoop );
|
||||||
|
TracyLfqCommit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
const auto sym = DecodeSymbolAddress( si.ptr );
|
||||||
|
TracyLfqPrepare( QueueType::SymbolInformation );
|
||||||
|
MemWrite( &item->symbolInformationFat.line, sym.line );
|
||||||
|
MemWrite( &item->symbolInformationFat.symAddr, si.ptr );
|
||||||
|
MemWrite( &item->symbolInformationFat.fileString, (uint64_t)sym.file );
|
||||||
|
MemWrite( &item->symbolInformationFat.needFree, (uint8_t)sym.needFree );
|
||||||
|
TracyLfqCommit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SymbolQueueItemType::CodeLocation:
|
||||||
|
{
|
||||||
|
const auto sym = DecodeCodeAddress( si.ptr );
|
||||||
|
const uint64_t offset = si.ptr - sym.symAddr;
|
||||||
|
TracyLfqPrepare( QueueType::CodeInformation );
|
||||||
|
MemWrite( &item->codeInformationFat.ptrOffset, offset );
|
||||||
|
MemWrite( &item->codeInformationFat.line, sym.line );
|
||||||
|
MemWrite( &item->codeInformationFat.symAddr, sym.symAddr );
|
||||||
|
MemWrite( &item->codeInformationFat.fileString, (uint64_t)sym.file );
|
||||||
|
MemWrite( &item->codeInformationFat.needFree, (uint8_t)sym.needFree );
|
||||||
|
TracyLfqCommit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef TRACY_HAS_SYSTEM_TRACING
|
||||||
|
case SymbolQueueItemType::ExternalName:
|
||||||
|
{
|
||||||
|
const char* threadName;
|
||||||
|
const char* name;
|
||||||
|
SysTraceGetExternalName( si.ptr, threadName, name );
|
||||||
|
TracyLfqPrepare( QueueType::ExternalNameMetadata );
|
||||||
|
MemWrite( &item->externalNameMetadata.thread, si.ptr );
|
||||||
|
MemWrite( &item->externalNameMetadata.name, (uint64_t)name );
|
||||||
|
MemWrite( &item->externalNameMetadata.threadName, (uint64_t)threadName );
|
||||||
|
TracyLfqCommit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
assert( false );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Profiler::SymbolWorker()
|
void Profiler::SymbolWorker()
|
||||||
{
|
{
|
||||||
ThreadExitHandler threadExitHandler;
|
ThreadExitHandler threadExitHandler;
|
||||||
@ -3061,73 +3132,7 @@ void Profiler::SymbolWorker()
|
|||||||
SymbolQueueItem si;
|
SymbolQueueItem si;
|
||||||
if( m_symbolQueue.try_dequeue( si ) )
|
if( m_symbolQueue.try_dequeue( si ) )
|
||||||
{
|
{
|
||||||
switch( si.type )
|
HandleSymbolQueueItem( si );
|
||||||
{
|
|
||||||
case SymbolQueueItemType::CallstackFrame:
|
|
||||||
{
|
|
||||||
const auto frameData = DecodeCallstackPtr( si.ptr );
|
|
||||||
auto data = tracy_malloc_fast( sizeof( CallstackEntry ) * frameData.size );
|
|
||||||
memcpy( data, frameData.data, sizeof( CallstackEntry ) * frameData.size );
|
|
||||||
TracyLfqPrepare( QueueType::CallstackFrameSize );
|
|
||||||
MemWrite( &item->callstackFrameSizeFat.ptr, si.ptr );
|
|
||||||
MemWrite( &item->callstackFrameSizeFat.size, frameData.size );
|
|
||||||
MemWrite( &item->callstackFrameSizeFat.data, (uint64_t)data );
|
|
||||||
MemWrite( &item->callstackFrameSizeFat.imageName, (uint64_t)frameData.imageName );
|
|
||||||
TracyLfqCommit;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SymbolQueueItemType::SymbolQuery:
|
|
||||||
{
|
|
||||||
#ifdef __ANDROID__
|
|
||||||
// On Android it's common for code to be in mappings that are only executable
|
|
||||||
// but not readable.
|
|
||||||
if( !EnsureReadable( si.ptr ) )
|
|
||||||
{
|
|
||||||
TracyLfqPrepare( QueueType::AckServerQueryNoop );
|
|
||||||
TracyLfqCommit;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
const auto sym = DecodeSymbolAddress( si.ptr );
|
|
||||||
TracyLfqPrepare( QueueType::SymbolInformation );
|
|
||||||
MemWrite( &item->symbolInformationFat.line, sym.line );
|
|
||||||
MemWrite( &item->symbolInformationFat.symAddr, si.ptr );
|
|
||||||
MemWrite( &item->symbolInformationFat.fileString, (uint64_t)sym.file );
|
|
||||||
MemWrite( &item->symbolInformationFat.needFree, (uint8_t)sym.needFree );
|
|
||||||
TracyLfqCommit;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SymbolQueueItemType::CodeLocation:
|
|
||||||
{
|
|
||||||
const auto sym = DecodeCodeAddress( si.ptr );
|
|
||||||
const uint64_t offset = si.ptr - sym.symAddr;
|
|
||||||
TracyLfqPrepare( QueueType::CodeInformation );
|
|
||||||
MemWrite( &item->codeInformationFat.ptrOffset, offset );
|
|
||||||
MemWrite( &item->codeInformationFat.line, sym.line );
|
|
||||||
MemWrite( &item->codeInformationFat.symAddr, sym.symAddr );
|
|
||||||
MemWrite( &item->codeInformationFat.fileString, (uint64_t)sym.file );
|
|
||||||
MemWrite( &item->codeInformationFat.needFree, (uint8_t)sym.needFree );
|
|
||||||
TracyLfqCommit;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#ifdef TRACY_HAS_SYSTEM_TRACING
|
|
||||||
case SymbolQueueItemType::ExternalName:
|
|
||||||
{
|
|
||||||
const char* threadName;
|
|
||||||
const char* name;
|
|
||||||
SysTraceGetExternalName( si.ptr, threadName, name );
|
|
||||||
TracyLfqPrepare( QueueType::ExternalNameMetadata );
|
|
||||||
MemWrite( &item->externalNameMetadata.thread, si.ptr );
|
|
||||||
MemWrite( &item->externalNameMetadata.name, (uint64_t)name );
|
|
||||||
MemWrite( &item->externalNameMetadata.threadName, (uint64_t)threadName );
|
|
||||||
TracyLfqCommit;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
assert( false );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -680,6 +680,7 @@ private:
|
|||||||
#ifdef TRACY_HAS_CALLSTACK
|
#ifdef TRACY_HAS_CALLSTACK
|
||||||
static void LaunchSymbolWorker( void* ptr ) { ((Profiler*)ptr)->SymbolWorker(); }
|
static void LaunchSymbolWorker( void* ptr ) { ((Profiler*)ptr)->SymbolWorker(); }
|
||||||
void SymbolWorker();
|
void SymbolWorker();
|
||||||
|
void HandleSymbolQueueItem( const SymbolQueueItem& si );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void ClearQueues( tracy::moodycamel::ConsumerToken& token );
|
void ClearQueues( tracy::moodycamel::ConsumerToken& token );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user