1
0
mirror of https://github.com/wolfpld/tracy synced 2025-04-30 12:53:51 +00:00

Allow running specific tasks on main thread.

This commit is contained in:
Bartosz Taudul 2020-08-15 14:59:16 +02:00
parent 518ce1e946
commit a3d8b5d225
3 changed files with 42 additions and 12 deletions

View File

@ -142,6 +142,22 @@ static std::atomic<ViewShutdown> viewShutdown { ViewShutdown::False };
static double animTime = 0; static double animTime = 0;
static float dpiScale = 1.f; static float dpiScale = 1.f;
static ImGuiTextFilter addrFilter, portFilter, progFilter; static ImGuiTextFilter addrFilter, portFilter, progFilter;
static std::thread::id mainThread;
static std::vector<std::function<void()>> mainThreadTasks;
static std::mutex mainThreadLock;
void RunOnMainThread( std::function<void()> cb )
{
if( std::this_thread::get_id() == mainThread )
{
cb();
}
else
{
std::lock_guard<std::mutex> lock( mainThreadLock );
mainThreadTasks.emplace_back( cb );
}
}
int main( int argc, char** argv ) int main( int argc, char** argv )
{ {
@ -215,6 +231,8 @@ int main( int argc, char** argv )
} }
} }
mainThread = std::this_thread::get_id();
// Setup window // Setup window
glfwSetErrorCallback(glfw_error_callback); glfwSetErrorCallback(glfw_error_callback);
if( !glfwInit() ) return 1; if( !glfwInit() ) return 1;
@ -305,7 +323,7 @@ int main( int argc, char** argv )
auto f = std::unique_ptr<tracy::FileRead>( tracy::FileRead::Open( argv[1] ) ); auto f = std::unique_ptr<tracy::FileRead>( tracy::FileRead::Open( argv[1] ) );
if( f ) if( f )
{ {
view = std::make_unique<tracy::View>( *f, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative ); view = std::make_unique<tracy::View>( RunOnMainThread, *f, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative );
} }
} }
else else
@ -331,7 +349,7 @@ int main( int argc, char** argv )
} }
if( connectTo ) if( connectTo )
{ {
view = std::make_unique<tracy::View>( connectTo, port, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative ); view = std::make_unique<tracy::View>( RunOnMainThread, connectTo, port, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative );
} }
glfwShowWindow( window ); glfwShowWindow( window );
@ -350,6 +368,14 @@ int main( int argc, char** argv )
{ {
std::this_thread::sleep_for( std::chrono::milliseconds( 50 ) ); std::this_thread::sleep_for( std::chrono::milliseconds( 50 ) );
} }
std::unique_lock<std::mutex> lock( mainThreadLock );
if( !mainThreadTasks.empty() )
{
std::vector<std::function<void()>> tmp;
std::swap( tmp, mainThreadTasks );
lock.unlock();
for( auto& cb : tmp ) cb();
}
} }
if( loadThread.joinable() ) loadThread.join(); if( loadThread.joinable() ) loadThread.join();
@ -635,11 +661,11 @@ static void DrawContents()
{ {
std::string addrPart = std::string( addr, ptr ); std::string addrPart = std::string( addr, ptr );
uint32_t portPart = atoi( ptr+1 ); uint32_t portPart = atoi( ptr+1 );
view = std::make_unique<tracy::View>( addrPart.c_str(), portPart, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative ); view = std::make_unique<tracy::View>( RunOnMainThread, addrPart.c_str(), portPart, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative );
} }
else else
{ {
view = std::make_unique<tracy::View>( addr, port, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative ); view = std::make_unique<tracy::View>( RunOnMainThread, addr, port, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative );
} }
} }
ImGui::SameLine( 0, ImGui::GetFontSize() * 2 ); ImGui::SameLine( 0, ImGui::GetFontSize() * 2 );
@ -657,7 +683,7 @@ static void DrawContents()
loadThread = std::thread( [f] { loadThread = std::thread( [f] {
try try
{ {
view = std::make_unique<tracy::View>( *f, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative ); view = std::make_unique<tracy::View>( RunOnMainThread, *f, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative );
} }
catch( const tracy::UnsupportedVersion& e ) catch( const tracy::UnsupportedVersion& e )
{ {
@ -779,7 +805,7 @@ static void DrawContents()
} }
if( selected && !loadThread.joinable() ) if( selected && !loadThread.joinable() )
{ {
view = std::make_unique<tracy::View>( v.second.address.c_str(), v.second.port, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative ); view = std::make_unique<tracy::View>( RunOnMainThread, v.second.address.c_str(), v.second.port, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative );
} }
ImGui::NextColumn(); ImGui::NextColumn();
const auto acttime = ( v.second.activeTime + ( time - v.second.time ) / 1000 ) * 1000000000ll; const auto acttime = ( v.second.activeTime + ( time - v.second.time ) / 1000 ) * 1000000000ll;
@ -919,7 +945,7 @@ static void DrawContents()
viewShutdown.store( ViewShutdown::False, std::memory_order_relaxed ); viewShutdown.store( ViewShutdown::False, std::memory_order_relaxed );
if( reconnect ) if( reconnect )
{ {
view = std::make_unique<tracy::View>( reconnectAddr.c_str(), reconnectPort, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative ); view = std::make_unique<tracy::View>( RunOnMainThread, reconnectAddr.c_str(), reconnectPort, fixedWidth, smallFont, bigFont, SetWindowTitleCallback, GetMainWindowNative );
} }
break; break;
default: default:

View File

@ -129,7 +129,7 @@ enum { MinFrameSize = 5 };
static View* s_instance = nullptr; static View* s_instance = nullptr;
View::View( const char* addr, int port, ImFont* fixedWidth, ImFont* smallFont, ImFont* bigFont, SetTitleCallback stcb, GetWindowCallback gwcb ) View::View( void(*cbMainThread)(std::function<void()>), const char* addr, int port, ImFont* fixedWidth, ImFont* smallFont, ImFont* bigFont, SetTitleCallback stcb, GetWindowCallback gwcb )
: m_worker( addr, port ) : m_worker( addr, port )
, m_staticView( false ) , m_staticView( false )
, m_pause( false ) , m_pause( false )
@ -142,6 +142,7 @@ View::View( const char* addr, int port, ImFont* fixedWidth, ImFont* smallFont, I
, m_stcb( stcb ) , m_stcb( stcb )
, m_gwcb( gwcb ) , m_gwcb( gwcb )
, m_userData() , m_userData()
, m_cbMainThread( cbMainThread )
{ {
assert( s_instance == nullptr ); assert( s_instance == nullptr );
s_instance = this; s_instance = this;
@ -149,7 +150,7 @@ View::View( const char* addr, int port, ImFont* fixedWidth, ImFont* smallFont, I
InitTextEditor( fixedWidth ); InitTextEditor( fixedWidth );
} }
View::View( FileRead& f, ImFont* fixedWidth, ImFont* smallFont, ImFont* bigFont, SetTitleCallback stcb, GetWindowCallback gwcb ) View::View( void(*cbMainThread)(std::function<void()>), FileRead& f, ImFont* fixedWidth, ImFont* smallFont, ImFont* bigFont, SetTitleCallback stcb, GetWindowCallback gwcb )
: m_worker( f ) : m_worker( f )
, m_filename( f.GetFilename() ) , m_filename( f.GetFilename() )
, m_staticView( true ) , m_staticView( true )
@ -161,6 +162,7 @@ View::View( FileRead& f, ImFont* fixedWidth, ImFont* smallFont, ImFont* bigFont,
, m_stcb( stcb ) , m_stcb( stcb )
, m_gwcb( gwcb ) , m_gwcb( gwcb )
, m_userData( m_worker.GetCaptureProgram().c_str(), m_worker.GetCaptureTime() ) , m_userData( m_worker.GetCaptureProgram().c_str(), m_worker.GetCaptureTime() )
, m_cbMainThread( cbMainThread )
{ {
assert( s_instance == nullptr ); assert( s_instance == nullptr );
s_instance = this; s_instance = this;

View File

@ -75,9 +75,9 @@ public:
using SetTitleCallback = void(*)( const char* ); using SetTitleCallback = void(*)( const char* );
using GetWindowCallback = void*(*)(); using GetWindowCallback = void*(*)();
View( ImFont* fixedWidth = nullptr, ImFont* smallFont = nullptr, ImFont* bigFont = nullptr, SetTitleCallback stcb = nullptr, GetWindowCallback gwcb = nullptr ) : View( "127.0.0.1", 8086, fixedWidth, smallFont, bigFont, stcb, gwcb ) {} View( void(*cbMainThread)(std::function<void()>), ImFont* fixedWidth = nullptr, ImFont* smallFont = nullptr, ImFont* bigFont = nullptr, SetTitleCallback stcb = nullptr, GetWindowCallback gwcb = nullptr ) : View( cbMainThread, "127.0.0.1", 8086, fixedWidth, smallFont, bigFont, stcb, gwcb ) {}
View( const char* addr, int port, ImFont* fixedWidth = nullptr, ImFont* smallFont = nullptr, ImFont* bigFont = nullptr, SetTitleCallback stcb = nullptr, GetWindowCallback gwcb = nullptr ); View( void(*cbMainThread)(std::function<void()>), const char* addr, int port, ImFont* fixedWidth = nullptr, ImFont* smallFont = nullptr, ImFont* bigFont = nullptr, SetTitleCallback stcb = nullptr, GetWindowCallback gwcb = nullptr );
View( FileRead& f, ImFont* fixedWidth = nullptr, ImFont* smallFont = nullptr, ImFont* bigFont = nullptr, SetTitleCallback stcb = nullptr, GetWindowCallback gwcb = nullptr ); View( void(*cbMainThread)(std::function<void()>), FileRead& f, ImFont* fixedWidth = nullptr, ImFont* smallFont = nullptr, ImFont* bigFont = nullptr, SetTitleCallback stcb = nullptr, GetWindowCallback gwcb = nullptr );
~View(); ~View();
static bool Draw(); static bool Draw();
@ -456,6 +456,8 @@ private:
RangeSlim m_setRangePopup; RangeSlim m_setRangePopup;
bool m_setRangePopupOpen = false; bool m_setRangePopupOpen = false;
void(*m_cbMainThread)(std::function<void()>);
struct FindZone { struct FindZone {
enum : uint64_t { Unselected = std::numeric_limits<uint64_t>::max() - 1 }; enum : uint64_t { Unselected = std::numeric_limits<uint64_t>::max() - 1 };
enum class GroupBy : int { Thread, UserText, ZoneName, Callstack, Parent, NoGrouping }; enum class GroupBy : int { Thread, UserText, ZoneName, Callstack, Parent, NoGrouping };