Add TracyIsStarted

When using TRACY_MANUAL_LIFETIME, calling most Tracy functions
before starting the profiler results in an assertion. Notably, even
TracyIsConnected is affected. There is, however, no function to check if
the profiler had already started. This commit adds such a function.
This commit is contained in:
Ivan Molodetskikh 2023-10-25 13:53:37 +04:00
parent 18054b4f34
commit 852a1a5f14
4 changed files with 23 additions and 0 deletions

View File

@ -1142,12 +1142,14 @@ thread_local bool RpThreadShutdown = false;
# ifdef TRACY_MANUAL_LIFETIME
ProfilerData* s_profilerData = nullptr;
static ProfilerThreadData& GetProfilerThreadData();
static std::atomic<bool> s_isProfilerStarted { false };
TRACY_API void StartupProfiler()
{
s_profilerData = (ProfilerData*)tracy_malloc( sizeof( ProfilerData ) );
new (s_profilerData) ProfilerData();
s_profilerData->profiler.SpawnWorkerThreads();
GetProfilerThreadData().token = ProducerWrapper( *s_profilerData );
s_isProfilerStarted.store( true, std::memory_order_seq_cst );
}
static ProfilerData& GetProfilerData()
{
@ -1156,6 +1158,7 @@ static ProfilerData& GetProfilerData()
}
TRACY_API void ShutdownProfiler()
{
s_isProfilerStarted.store( false, std::memory_order_seq_cst );
s_profilerData->~ProfilerData();
tracy_free( s_profilerData );
s_profilerData = nullptr;
@ -1163,6 +1166,10 @@ TRACY_API void ShutdownProfiler()
RpThreadInitDone = false;
RpInitDone.store( 0, std::memory_order_release );
}
TRACY_API bool IsProfilerStarted()
{
return s_isProfilerStarted.load( std::memory_order_seq_cst );
}
# else
static std::atomic<int> profilerDataLock { 0 };
static std::atomic<ProfilerData*> profilerData { nullptr };
@ -4439,6 +4446,11 @@ TRACY_API void ___tracy_shutdown_profiler( void )
{
tracy::ShutdownProfiler();
}
TRACY_API int ___tracy_profiler_started( void )
{
return tracy::s_isProfilerStarted.load( std::memory_order_seq_cst );
}
# endif
#ifdef __cplusplus

View File

@ -51,6 +51,10 @@ namespace tracy
#if defined(TRACY_DELAYED_INIT) && defined(TRACY_MANUAL_LIFETIME)
TRACY_API void StartupProfiler();
TRACY_API void ShutdownProfiler();
TRACY_API bool IsProfilerStarted();
# define TracyIsStarted tracy::IsProfilerStarted()
#else
# define TracyIsStarted true
#endif
class GpuCtx;

View File

@ -109,6 +109,7 @@
#define TracyParameterRegister(x,y)
#define TracyParameterSetup(x,y,z,w)
#define TracyIsConnected false
#define TracyIsStarted false
#define TracySetProgramName(x)
#define TracyFiberEnter(x)

View File

@ -97,6 +97,7 @@ typedef const void* TracyCZoneCtx;
#define TracyCMessageLCS(x,y,z)
#define TracyCIsConnected 0
#define TracyCIsStarted 0
#ifdef TRACY_FIBERS
# define TracyCFiberEnter(fiber)
@ -185,6 +186,11 @@ typedef /*const*/ struct ___tracy_c_zone_context TracyCZoneCtx;
#ifdef TRACY_MANUAL_LIFETIME
TRACY_API void ___tracy_startup_profiler(void);
TRACY_API void ___tracy_shutdown_profiler(void);
TRACY_API int ___tracy_profiler_started(void);
# define TracyCIsStarted ___tracy_profiler_started()
#else
# define TracyCIsStarted 1
#endif
TRACY_API uint64_t ___tracy_alloc_srcloc( uint32_t line, const char* source, size_t sourceSz, const char* function, size_t functionSz );