mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-27 08:14:34 +00:00
a56c47a6a0
This saves us a non-inlineable function call. Thread local block is accessed anyway, since we need to get the token, so we already have the pointer and don't need to get it a second time (which is done inside Windows' GetCurrentThreadId()). We also don't need to store the thread id in ScopedZone anymore, as it was a micro-optimization to save us the second GetThreadHandle() call. This change has a measurable effect of reducing enqueue time from ~10 to ~8 ns. A further optimization would be to completely skip thread handle retrieval during zone capture and do it instead on retrieval of data from the queue. Since each thread has its own producer ("token"), the thread handle should be accessible during the dequeue operation. This is a much more invasive change, that would require a) modification of the queue, b) additional processing of dequeued data to inject the thread handle.
57 lines
1.4 KiB
C++
57 lines
1.4 KiB
C++
#ifndef __TRACYSYSTEM_HPP__
|
|
#define __TRACYSYSTEM_HPP__
|
|
|
|
#ifdef TRACY_ENABLE
|
|
# if defined __ANDROID__ || defined __CYGWIN__ || defined __APPLE__ || defined _GNU_SOURCE || ( defined _WIN32 && ( !defined NTDDI_WIN10_RS2 || NTDDI_VERSION < NTDDI_WIN10_RS2 ) )
|
|
# define TRACY_COLLECT_THREAD_NAMES
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef _WIN32
|
|
# ifndef _WINDOWS_
|
|
extern "C" __declspec(dllimport) unsigned long __stdcall GetCurrentThreadId(void);
|
|
# endif
|
|
#else
|
|
# include <pthread.h>
|
|
#endif
|
|
|
|
#include <stdint.h>
|
|
#include <thread>
|
|
|
|
#include "TracyApi.h"
|
|
|
|
namespace tracy
|
|
{
|
|
|
|
#ifdef TRACY_ENABLE
|
|
static inline uint64_t GetThreadHandleImpl()
|
|
{
|
|
#ifdef _WIN32
|
|
static_assert( sizeof( decltype( GetCurrentThreadId() ) ) <= sizeof( uint64_t ), "Thread handle too big to fit in protocol" );
|
|
return uint64_t( GetCurrentThreadId() );
|
|
#elif defined __APPLE__
|
|
uint64_t id;
|
|
pthread_threadid_np( pthread_self(), &id );
|
|
return id;
|
|
#else
|
|
static_assert( sizeof( decltype( pthread_self() ) ) <= sizeof( uint64_t ), "Thread handle too big to fit in protocol" );
|
|
return uint64_t( pthread_self() );
|
|
#endif
|
|
}
|
|
|
|
const thread_local auto s_threadHandle = GetThreadHandleImpl();
|
|
|
|
static inline uint64_t GetThreadHandle()
|
|
{
|
|
return s_threadHandle;
|
|
}
|
|
#endif
|
|
|
|
void SetThreadName( std::thread& thread, const char* name );
|
|
void SetThreadName( std::thread::native_handle_type handle, const char* name );
|
|
const char* GetThreadName( uint64_t id );
|
|
|
|
}
|
|
|
|
#endif
|