mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-26 16:04:34 +00:00
Lua callstack sending.
This commit is contained in:
parent
2c16bdd538
commit
b8501956f9
206
TracyLua.hpp
206
TracyLua.hpp
@ -23,6 +23,10 @@ static inline void LuaRegister( lua_State* L )
|
|||||||
lua_pushcfunction( L, detail::noop );
|
lua_pushcfunction( L, detail::noop );
|
||||||
lua_setfield( L, -2, "ZoneBeginN" );
|
lua_setfield( L, -2, "ZoneBeginN" );
|
||||||
lua_pushcfunction( L, detail::noop );
|
lua_pushcfunction( L, detail::noop );
|
||||||
|
lua_setfield( L, -2, "ZoneBeginS" );
|
||||||
|
lua_pushcfunction( L, detail::noop );
|
||||||
|
lua_setfield( L, -2, "ZoneBeginNS" );
|
||||||
|
lua_pushcfunction( L, detail::noop );
|
||||||
lua_setfield( L, -2, "ZoneEnd" );
|
lua_setfield( L, -2, "ZoneEnd" );
|
||||||
lua_pushcfunction( L, detail::noop );
|
lua_pushcfunction( L, detail::noop );
|
||||||
lua_setfield( L, -2, "ZoneText" );
|
lua_setfield( L, -2, "ZoneText" );
|
||||||
@ -81,6 +85,18 @@ static inline void LuaRemove( char* script )
|
|||||||
memset( script, ' ', end - script );
|
memset( script, ' ', end - script );
|
||||||
script = end;
|
script = end;
|
||||||
}
|
}
|
||||||
|
else if( strncmp( script + 10, "BeginS(", 7 ) == 0 )
|
||||||
|
{
|
||||||
|
auto end = FindEnd( script + 17 );
|
||||||
|
memset( script, ' ', end - script );
|
||||||
|
script = end;
|
||||||
|
}
|
||||||
|
else if( strncmp( script + 10, "BeginNS(", 8 ) == 0 )
|
||||||
|
{
|
||||||
|
auto end = FindEnd( script + 18 );
|
||||||
|
memset( script, ' ', end - script );
|
||||||
|
script = end;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
script += 10;
|
script += 10;
|
||||||
@ -125,7 +141,53 @@ LuaZoneState& GetLuaZoneState();
|
|||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
static inline int LuaZoneBegin( lua_State* L )
|
static inline void SendLuaCallstack( lua_State* L, uint32_t depth )
|
||||||
|
{
|
||||||
|
assert( depth <= 64 );
|
||||||
|
lua_Debug dbg[64];
|
||||||
|
const char* func[64];
|
||||||
|
uint32_t fsz[64];
|
||||||
|
uint32_t ssz[64];
|
||||||
|
uint32_t spaceNeeded = 4; // cnt
|
||||||
|
|
||||||
|
uint32_t cnt;
|
||||||
|
for( cnt=0; cnt<depth; cnt++ )
|
||||||
|
{
|
||||||
|
if( lua_getstack( L, cnt+1, dbg+cnt ) == 0 ) break;
|
||||||
|
lua_getinfo( L, "Snl", dbg+cnt );
|
||||||
|
func[cnt] = dbg[cnt].name ? dbg[cnt].name : dbg[cnt].short_src;
|
||||||
|
fsz[cnt] = uint32_t( strlen( func[cnt] ) );
|
||||||
|
ssz[cnt] = uint32_t( strlen( dbg[cnt].source ) );
|
||||||
|
spaceNeeded += fsz[cnt] + ssz[cnt];
|
||||||
|
}
|
||||||
|
spaceNeeded += cnt * ( 4 + 4 + 4 ); // source line, function string length, source string length
|
||||||
|
|
||||||
|
auto ptr = (char*)tracy_malloc( spaceNeeded + 4 );
|
||||||
|
auto dst = ptr;
|
||||||
|
memcpy( dst, &spaceNeeded, 4 ); dst += 4;
|
||||||
|
memcpy( dst, &cnt, 4 ); dst += 4;
|
||||||
|
for( uint32_t i=0; i<cnt; i++ )
|
||||||
|
{
|
||||||
|
const uint32_t line = dbg[i].currentline;
|
||||||
|
memcpy( dst, &line, 4 ); dst += 4;
|
||||||
|
memcpy( dst, fsz+i, 4 ); dst += 4;
|
||||||
|
memcpy( dst, func[i], fsz[i] ); dst += fsz[i];
|
||||||
|
memcpy( dst, ssz+i, 4 ); dst += 4;
|
||||||
|
memcpy( dst, dbg[i].source, ssz[i] ), dst += ssz[i];
|
||||||
|
}
|
||||||
|
assert( dst - ptr == spaceNeeded + 4 );
|
||||||
|
|
||||||
|
Magic magic;
|
||||||
|
auto token = GetToken();
|
||||||
|
auto& tail = token->get_tail_index();
|
||||||
|
auto item = token->enqueue_begin<tracy::moodycamel::CanAlloc>( magic );
|
||||||
|
MemWrite( &item->hdr.type, QueueType::CallstackAlloc );
|
||||||
|
MemWrite( &item->callstack.ptr, (uint64_t)ptr );
|
||||||
|
MemWrite( &item->callstack.thread, GetThreadHandle() );
|
||||||
|
tail.store( magic + 1, std::memory_order_release );
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int LuaZoneBeginS( lua_State* L )
|
||||||
{
|
{
|
||||||
#ifdef TRACY_ON_DEMAND
|
#ifdef TRACY_ON_DEMAND
|
||||||
const auto zoneCnt = GetLuaZoneState().counter++;
|
const auto zoneCnt = GetLuaZoneState().counter++;
|
||||||
@ -176,10 +238,18 @@ static inline int LuaZoneBegin( lua_State* L )
|
|||||||
MemWrite( &item->zoneBegin.thread, GetThreadHandle() );
|
MemWrite( &item->zoneBegin.thread, GetThreadHandle() );
|
||||||
MemWrite( &item->zoneBegin.srcloc, (uint64_t)ptr );
|
MemWrite( &item->zoneBegin.srcloc, (uint64_t)ptr );
|
||||||
tail.store( magic + 1, std::memory_order_release );
|
tail.store( magic + 1, std::memory_order_release );
|
||||||
|
|
||||||
|
#ifdef TRACY_CALLSTACK
|
||||||
|
const uint32_t depth = TRACY_CALLSTACK;
|
||||||
|
#else
|
||||||
|
const auto depth = uint32_t( lua_tointeger( L, 1 ) );
|
||||||
|
#endif
|
||||||
|
SendLuaCallstack( L, depth );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int LuaZoneBeginN( lua_State* L )
|
static inline int LuaZoneBeginNS( lua_State* L )
|
||||||
{
|
{
|
||||||
#ifdef TRACY_ON_DEMAND
|
#ifdef TRACY_ON_DEMAND
|
||||||
const auto zoneCnt = GetLuaZoneState().counter++;
|
const auto zoneCnt = GetLuaZoneState().counter++;
|
||||||
@ -234,9 +304,137 @@ static inline int LuaZoneBeginN( lua_State* L )
|
|||||||
MemWrite( &item->zoneBegin.thread, GetThreadHandle() );
|
MemWrite( &item->zoneBegin.thread, GetThreadHandle() );
|
||||||
MemWrite( &item->zoneBegin.srcloc, (uint64_t)ptr );
|
MemWrite( &item->zoneBegin.srcloc, (uint64_t)ptr );
|
||||||
tail.store( magic + 1, std::memory_order_release );
|
tail.store( magic + 1, std::memory_order_release );
|
||||||
|
|
||||||
|
#ifdef TRACY_CALLSTACK
|
||||||
|
const uint32_t depth = TRACY_CALLSTACK;
|
||||||
|
#else
|
||||||
|
const auto depth = uint32_t( lua_tointeger( L, 1 ) );
|
||||||
|
#endif
|
||||||
|
SendLuaCallstack( L, depth );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int LuaZoneBegin( lua_State* L )
|
||||||
|
{
|
||||||
|
#ifdef TRACY_CALLSTACK
|
||||||
|
return LuaZoneBeginS( L );
|
||||||
|
#else
|
||||||
|
#ifdef TRACY_ON_DEMAND
|
||||||
|
const auto zoneCnt = GetLuaZoneState().counter++;
|
||||||
|
if( zoneCnt != 0 && !GetLuaZoneState().active ) return 0;
|
||||||
|
GetLuaZoneState().active = GetProfiler().IsConnected();
|
||||||
|
if( !GetLuaZoneState().active ) return 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const uint32_t color = Color::DeepSkyBlue3;
|
||||||
|
|
||||||
|
lua_Debug dbg;
|
||||||
|
lua_getstack( L, 1, &dbg );
|
||||||
|
lua_getinfo( L, "Snl", &dbg );
|
||||||
|
|
||||||
|
const uint32_t line = dbg.currentline;
|
||||||
|
const auto func = dbg.name ? dbg.name : dbg.short_src;
|
||||||
|
const auto fsz = strlen( func );
|
||||||
|
const auto ssz = strlen( dbg.source );
|
||||||
|
|
||||||
|
// Data layout:
|
||||||
|
// 4b payload size
|
||||||
|
// 4b color
|
||||||
|
// 4b source line
|
||||||
|
// fsz function name
|
||||||
|
// 1b null terminator
|
||||||
|
// ssz source file name
|
||||||
|
// 1b null terminator
|
||||||
|
const uint32_t sz = uint32_t( 4 + 4 + 4 + fsz + 1 + ssz + 1 );
|
||||||
|
auto ptr = (char*)tracy_malloc( sz );
|
||||||
|
memcpy( ptr, &sz, 4 );
|
||||||
|
memcpy( ptr + 4, &color, 4 );
|
||||||
|
memcpy( ptr + 8, &line, 4 );
|
||||||
|
memcpy( ptr + 12, func, fsz+1 );
|
||||||
|
memcpy( ptr + 12 + fsz + 1, dbg.source, ssz + 1 );
|
||||||
|
|
||||||
|
Magic magic;
|
||||||
|
auto token = GetToken();
|
||||||
|
auto& tail = token->get_tail_index();
|
||||||
|
auto item = token->enqueue_begin<tracy::moodycamel::CanAlloc>( magic );
|
||||||
|
MemWrite( &item->hdr.type, QueueType::ZoneBeginAllocSrcLoc );
|
||||||
|
#ifdef TRACY_RDTSCP_OPT
|
||||||
|
MemWrite( &item->zoneBegin.time, Profiler::GetTime( item->zoneBegin.cpu ) );
|
||||||
|
#else
|
||||||
|
uint32_t cpu;
|
||||||
|
MemWrite( &item->zoneBegin.time, Profiler::GetTime( cpu ) );
|
||||||
|
MemWrite( &item->zoneBegin.cpu, cpu );
|
||||||
|
#endif
|
||||||
|
MemWrite( &item->zoneBegin.thread, GetThreadHandle() );
|
||||||
|
MemWrite( &item->zoneBegin.srcloc, (uint64_t)ptr );
|
||||||
|
tail.store( magic + 1, std::memory_order_release );
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int LuaZoneBeginN( lua_State* L )
|
||||||
|
{
|
||||||
|
#ifdef TRACY_CALLSTACK
|
||||||
|
return LuaZoneBeginNS( L );
|
||||||
|
#else
|
||||||
|
#ifdef TRACY_ON_DEMAND
|
||||||
|
const auto zoneCnt = GetLuaZoneState().counter++;
|
||||||
|
if( zoneCnt != 0 && !GetLuaZoneState().active ) return 0;
|
||||||
|
GetLuaZoneState().active = GetProfiler().IsConnected();
|
||||||
|
if( !GetLuaZoneState().active ) return 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const uint32_t color = Color::DeepSkyBlue3;
|
||||||
|
|
||||||
|
lua_Debug dbg;
|
||||||
|
lua_getstack( L, 1, &dbg );
|
||||||
|
lua_getinfo( L, "Snl", &dbg );
|
||||||
|
|
||||||
|
const uint32_t line = dbg.currentline;
|
||||||
|
const auto func = dbg.name ? dbg.name : dbg.short_src;
|
||||||
|
size_t nsz;
|
||||||
|
const auto name = lua_tolstring( L, 1, &nsz );
|
||||||
|
const auto fsz = strlen( func );
|
||||||
|
const auto ssz = strlen( dbg.source );
|
||||||
|
|
||||||
|
// Data layout:
|
||||||
|
// 4b payload size
|
||||||
|
// 4b color
|
||||||
|
// 4b source line
|
||||||
|
// fsz function name
|
||||||
|
// 1b null terminator
|
||||||
|
// ssz source file name
|
||||||
|
// 1b null terminator
|
||||||
|
// nsz zone name
|
||||||
|
const uint32_t sz = uint32_t( 4 + 4 + 4 + fsz + 1 + ssz + 1 + nsz );
|
||||||
|
auto ptr = (char*)tracy_malloc( sz );
|
||||||
|
memcpy( ptr, &sz, 4 );
|
||||||
|
memcpy( ptr + 4, &color, 4 );
|
||||||
|
memcpy( ptr + 8, &line, 4 );
|
||||||
|
memcpy( ptr + 12, func, fsz+1 );
|
||||||
|
memcpy( ptr + 12 + fsz + 1, dbg.source, ssz + 1 );
|
||||||
|
memcpy( ptr + 12 + fsz + 1 + ssz + 1, name, nsz );
|
||||||
|
|
||||||
|
Magic magic;
|
||||||
|
auto token = GetToken();
|
||||||
|
auto& tail = token->get_tail_index();
|
||||||
|
auto item = token->enqueue_begin<tracy::moodycamel::CanAlloc>( magic );
|
||||||
|
MemWrite( &item->hdr.type, QueueType::ZoneBeginAllocSrcLoc );
|
||||||
|
#ifdef TRACY_RDTSCP_OPT
|
||||||
|
MemWrite( &item->zoneBegin.time, Profiler::GetTime( item->zoneBegin.cpu ) );
|
||||||
|
#else
|
||||||
|
uint32_t cpu;
|
||||||
|
MemWrite( &item->zoneBegin.time, Profiler::GetTime( cpu ) );
|
||||||
|
MemWrite( &item->zoneBegin.cpu, cpu );
|
||||||
|
#endif
|
||||||
|
MemWrite( &item->zoneBegin.thread, GetThreadHandle() );
|
||||||
|
MemWrite( &item->zoneBegin.srcloc, (uint64_t)ptr );
|
||||||
|
tail.store( magic + 1, std::memory_order_release );
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static inline int LuaZoneEnd( lua_State* L )
|
static inline int LuaZoneEnd( lua_State* L )
|
||||||
{
|
{
|
||||||
#ifdef TRACY_ON_DEMAND
|
#ifdef TRACY_ON_DEMAND
|
||||||
@ -356,6 +554,10 @@ static inline void LuaRegister( lua_State* L )
|
|||||||
lua_setfield( L, -2, "ZoneBegin" );
|
lua_setfield( L, -2, "ZoneBegin" );
|
||||||
lua_pushcfunction( L, detail::LuaZoneBeginN );
|
lua_pushcfunction( L, detail::LuaZoneBeginN );
|
||||||
lua_setfield( L, -2, "ZoneBeginN" );
|
lua_setfield( L, -2, "ZoneBeginN" );
|
||||||
|
lua_pushcfunction( L, detail::LuaZoneBeginS );
|
||||||
|
lua_setfield( L, -2, "ZoneBeginS" );
|
||||||
|
lua_pushcfunction( L, detail::LuaZoneBeginNS );
|
||||||
|
lua_setfield( L, -2, "ZoneBeginNS" );
|
||||||
lua_pushcfunction( L, detail::LuaZoneEnd );
|
lua_pushcfunction( L, detail::LuaZoneEnd );
|
||||||
lua_setfield( L, -2, "ZoneEnd" );
|
lua_setfield( L, -2, "ZoneEnd" );
|
||||||
lua_pushcfunction( L, detail::LuaZoneText );
|
lua_pushcfunction( L, detail::LuaZoneText );
|
||||||
|
@ -14,6 +14,7 @@ enum class QueueType : uint8_t
|
|||||||
ZoneBeginAllocSrcLoc,
|
ZoneBeginAllocSrcLoc,
|
||||||
CallstackMemory,
|
CallstackMemory,
|
||||||
Callstack,
|
Callstack,
|
||||||
|
CallstackAlloc,
|
||||||
Terminate,
|
Terminate,
|
||||||
KeepAlive,
|
KeepAlive,
|
||||||
Crash,
|
Crash,
|
||||||
@ -327,6 +328,7 @@ static const size_t QueueDataSize[] = {
|
|||||||
sizeof( QueueHeader ) + sizeof( QueueZoneBegin ), // allocated source location
|
sizeof( QueueHeader ) + sizeof( QueueZoneBegin ), // allocated source location
|
||||||
sizeof( QueueHeader ) + sizeof( QueueCallstackMemory ),
|
sizeof( QueueHeader ) + sizeof( QueueCallstackMemory ),
|
||||||
sizeof( QueueHeader ) + sizeof( QueueCallstack ),
|
sizeof( QueueHeader ) + sizeof( QueueCallstack ),
|
||||||
|
sizeof( QueueHeader ) + sizeof( QueueCallstack ), // callstack alloc
|
||||||
// above items must be first
|
// above items must be first
|
||||||
sizeof( QueueHeader ), // terminate
|
sizeof( QueueHeader ), // terminate
|
||||||
sizeof( QueueHeader ), // keep alive
|
sizeof( QueueHeader ), // keep alive
|
||||||
|
Loading…
Reference in New Issue
Block a user