diff --git a/profiler/build/win32/Tracy.vcxproj b/profiler/build/win32/Tracy.vcxproj index 7dea1ca6..cbfd688f 100644 --- a/profiler/build/win32/Tracy.vcxproj +++ b/profiler/build/win32/Tracy.vcxproj @@ -196,6 +196,7 @@ + @@ -316,6 +317,7 @@ + diff --git a/profiler/build/win32/Tracy.vcxproj.filters b/profiler/build/win32/Tracy.vcxproj.filters index 89433012..0eae1031 100644 --- a/profiler/build/win32/Tracy.vcxproj.filters +++ b/profiler/build/win32/Tracy.vcxproj.filters @@ -345,6 +345,9 @@ src + + src + @@ -701,6 +704,9 @@ src + + src + diff --git a/profiler/src/Filters.cpp b/profiler/src/Filters.cpp new file mode 100644 index 00000000..c004df30 --- /dev/null +++ b/profiler/src/Filters.cpp @@ -0,0 +1,87 @@ +#include +#include +#include + +#include "Filters.hpp" + +#include "../../server/TracyStorage.hpp" + + +Filters::Filters() + : m_fn( tracy::GetSavePath( "client.filters" ) ) +{ + FILE* f = fopen( m_fn.c_str(), "rb" ); + if( !f ) return; + + uint8_t sz; + fread( &sz, 1, sizeof( sz ), f ); + fread( m_addrFilter.InputBuf, 1, sz, f ); + m_addrFilter.Build(); + + fread( &sz, 1, sizeof( sz ), f ); + fread( m_portFilter.InputBuf, 1, sz, f ); + m_portFilter.Build(); + + fread( &sz, 1, sizeof( sz ), f ); + fread( m_progFilter.InputBuf, 1, sz, f ); + m_progFilter.Build(); + + fclose( f ); +} + +Filters::~Filters() +{ + FILE* f = fopen( m_fn.c_str(), "wb" ); + if( !f ) return; + + uint8_t sz = strlen( m_addrFilter.InputBuf ); + fwrite( &sz, 1, sizeof( sz ), f ); + fwrite( m_addrFilter.InputBuf, 1, sz, f ); + + sz = strlen( m_portFilter.InputBuf ); + fwrite( &sz, 1, sizeof( sz ), f ); + fwrite( m_portFilter.InputBuf, 1, sz, f ); + + sz = strlen( m_progFilter.InputBuf ); + fwrite( &sz, 1, sizeof( sz ), f ); + fwrite( m_progFilter.InputBuf, 1, sz, f ); + + fclose( f ); +} + +void Filters::Clear() +{ + m_addrFilter.Clear(); + m_portFilter.Clear(); + m_progFilter.Clear(); +} + +void Filters::Draw( float w ) +{ + m_addrFilter.Draw( "Address filter", w ); + m_portFilter.Draw( "Port filter", w ); + m_progFilter.Draw( "Program filter", w ); +} + +bool Filters::IsActive() const +{ + return m_addrFilter.IsActive() || m_portFilter.IsActive() || m_progFilter.IsActive(); +} + +bool Filters::FailAddr( const char* addr ) +{ + return m_addrFilter.IsActive() && !m_addrFilter.PassFilter( addr ); +} + +bool Filters::FailPort( uint16_t port ) +{ + if( !m_portFilter.IsActive() ) return false; + char buf[32]; + sprintf( buf, "%" PRIu16, port ); + return !m_portFilter.PassFilter( buf ); +} + +bool Filters::FailProg( const char* prog ) +{ + return m_progFilter.IsActive() && !m_progFilter.PassFilter( prog ); +} diff --git a/profiler/src/Filters.hpp b/profiler/src/Filters.hpp new file mode 100644 index 00000000..e001fd0c --- /dev/null +++ b/profiler/src/Filters.hpp @@ -0,0 +1,28 @@ +#ifndef __FILTERS_HPP__ +#define __FILTERS_HPP__ + +#include +#include + +class Filters +{ +public: + Filters(); + ~Filters(); + + void Clear(); + void Draw( float w ); + + bool IsActive() const; + + bool FailAddr( const char* addr ); + bool FailPort( uint16_t port ); + bool FailProg( const char* prog ); + +private: + std::string m_fn; + + ImGuiTextFilter m_addrFilter, m_portFilter, m_progFilter; +}; + +#endif diff --git a/profiler/src/main.cpp b/profiler/src/main.cpp index b4fdf7b5..3fa607d7 100644 --- a/profiler/src/main.cpp +++ b/profiler/src/main.cpp @@ -49,8 +49,10 @@ #include "../../server/IconsFontAwesome5.h" #include "icon.hpp" -#include "Fonts.hpp" + #include "ConnectionHistory.hpp" +#include "Filters.hpp" +#include "Fonts.hpp" #include "HttpRequest.hpp" #include "NativeWindow.hpp" #include "ResolvService.hpp" @@ -108,7 +110,7 @@ static ConnectionHistory* connHist; static std::atomic viewShutdown { ViewShutdown::False }; static double animTime = 0; static float dpiScale = 1.f; -static ImGuiTextFilter addrFilter, portFilter, progFilter; +static Filters* filt; static RunQueue mainThreadTasks; static uint32_t updateVersion = 0; static bool showReleaseNotes = false; @@ -189,30 +191,10 @@ int main( int argc, char** argv ) WindowPosition winPos; ConnectionHistory connHistory; + Filters filters; connHist = &connHistory; - - std::string filtersFile = tracy::GetSavePath( "client.filters" ); - { - FILE* f = fopen( filtersFile.c_str(), "rb" ); - if( f ) - { - uint8_t sz; - fread( &sz, 1, sizeof( sz ), f ); - fread( addrFilter.InputBuf, 1, sz, f ); - addrFilter.Build(); - - fread( &sz, 1, sizeof( sz ), f ); - fread( portFilter.InputBuf, 1, sz, f ); - portFilter.Build(); - - fread( &sz, 1, sizeof( sz ), f ); - fread( progFilter.InputBuf, 1, sz, f ); - progFilter.Build(); - - fclose( f ); - } - } + filt = &filters; updateThread = std::thread( [] { HttpRequest( "nereid.pl", "/tracy/version", 8099, [] ( int size, char* data ) { @@ -360,26 +342,6 @@ int main( int argc, char** argv ) glfwTerminate(); - { - FILE* f = fopen( filtersFile.c_str(), "wb" ); - if( f ) - { - uint8_t sz = strlen( addrFilter.InputBuf ); - fwrite( &sz, 1, sizeof( sz ), f ); - fwrite( addrFilter.InputBuf, 1, sz, f ); - - sz = strlen( portFilter.InputBuf ); - fwrite( &sz, 1, sizeof( sz ), f ); - fwrite( portFilter.InputBuf, 1, sz, f ); - - sz = strlen( progFilter.InputBuf ); - fwrite( &sz, 1, sizeof( sz ), f ); - fwrite( progFilter.InputBuf, 1, sz, f ); - - fclose( f ); - } - } - return 0; } @@ -707,7 +669,7 @@ static void DrawContents() ImGui::TextUnformatted( "Discovered clients:" ); ImGui::SameLine(); tracy::SmallToggleButton( ICON_FA_FILTER " Filter", showFilter ); - if( addrFilter.IsActive() || portFilter.IsActive() || progFilter.IsActive() ) + if( filt->IsActive() ) { ImGui::SameLine(); tracy::TextColoredUnformatted( 0xFF00FFFF, ICON_FA_EXCLAMATION_TRIANGLE ); @@ -717,9 +679,7 @@ static void DrawContents() ImGui::SameLine(); if( ImGui::SmallButton( ICON_FA_BACKSPACE " Clear" ) ) { - addrFilter.Clear(); - portFilter.Clear(); - progFilter.Clear(); + filt->Clear(); } } } @@ -727,9 +687,7 @@ static void DrawContents() { const auto w = ImGui::GetTextLineHeight() * 12; ImGui::Separator(); - addrFilter.Draw( "Address filter", w ); - portFilter.Draw( "Port filter", w ); - progFilter.Draw( "Program filter", w ); + filt->Draw( w ); } ImGui::Separator(); static bool widthSet = false; @@ -751,14 +709,9 @@ static void DrawContents() bool sel = false; const auto& name = resolvMap.find( v.second.address ); assert( name != resolvMap.end() ); - if( addrFilter.IsActive() && !addrFilter.PassFilter( name->second.c_str() ) && !addrFilter.PassFilter( v.second.address.c_str() ) ) continue; - if( portFilter.IsActive() ) - { - char buf[32]; - sprintf( buf, "%" PRIu16, v.second.port ); - if( !portFilter.PassFilter( buf ) ) continue; - } - if( progFilter.IsActive() && !progFilter.PassFilter( v.second.procName.c_str() ) ) continue; + if( filt->FailAddr( name->second.c_str() ) && filt->FailAddr( v.second.address.c_str() ) ) continue; + if( filt->FailPort( v.second.port ) ) continue; + if( filt->FailProg( v.second.procName.c_str() ) ) continue; ImGuiSelectableFlags flags = ImGuiSelectableFlags_SpanAllColumns; if( badProto ) flags |= ImGuiSelectableFlags_Disabled; ImGui::PushID( idx++ );