diff options
author | Bartosz Taudul <wolf@nereid.pl> | 2022-07-25 21:17:13 +0300 |
---|---|---|
committer | Bartosz Taudul <wolf@nereid.pl> | 2022-07-28 01:24:45 +0300 |
commit | 208755ad532c3bb812dda38973b8fd6ab185689c (patch) | |
tree | 494177b84a00d9fda66e6bde3152ced21d37ebd0 /profiler | |
parent | f0f00512b0dc51f7d90b97926b7e633a2cd4c1ef (diff) |
Extract main thread run queue.
Diffstat (limited to 'profiler')
-rw-r--r-- | profiler/build/win32/Tracy.vcxproj | 2 | ||||
-rw-r--r-- | profiler/build/win32/Tracy.vcxproj.filters | 6 | ||||
-rw-r--r-- | profiler/src/RunQueue.cpp | 31 | ||||
-rw-r--r-- | profiler/src/RunQueue.hpp | 23 | ||||
-rw-r--r-- | profiler/src/main.cpp | 26 |
5 files changed, 66 insertions, 22 deletions
diff --git a/profiler/build/win32/Tracy.vcxproj b/profiler/build/win32/Tracy.vcxproj index fe713213..947890aa 100644 --- a/profiler/build/win32/Tracy.vcxproj +++ b/profiler/build/win32/Tracy.vcxproj @@ -202,6 +202,7 @@ <ClCompile Include="..\..\src\main.cpp" /> <ClCompile Include="..\..\src\NativeWindow.cpp" /> <ClCompile Include="..\..\src\ResolvService.cpp" /> + <ClCompile Include="..\..\src\RunQueue.cpp" /> <ClCompile Include="..\..\src\winmain.cpp"> <EnableEnhancedInstructionSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotSet</EnableEnhancedInstructionSet> <EnableEnhancedInstructionSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotSet</EnableEnhancedInstructionSet> @@ -323,6 +324,7 @@ <ClInclude Include="..\..\src\imgui\imgui_impl_opengl3_loader.h" /> <ClInclude Include="..\..\src\NativeWindow.hpp" /> <ClInclude Include="..\..\src\ResolvService.hpp" /> + <ClInclude Include="..\..\src\RunQueue.hpp" /> <ClInclude Include="..\..\src\stb_image.h" /> </ItemGroup> <ItemGroup> diff --git a/profiler/build/win32/Tracy.vcxproj.filters b/profiler/build/win32/Tracy.vcxproj.filters index e256df08..06f1982c 100644 --- a/profiler/build/win32/Tracy.vcxproj.filters +++ b/profiler/build/win32/Tracy.vcxproj.filters @@ -336,6 +336,9 @@ <ClCompile Include="..\..\src\Fonts.cpp"> <Filter>src</Filter> </ClCompile> + <ClCompile Include="..\..\src\RunQueue.cpp"> + <Filter>src</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\..\server\TracyEvent.hpp"> @@ -683,6 +686,9 @@ <ClInclude Include="..\..\src\Fonts.hpp"> <Filter>src</Filter> </ClInclude> + <ClInclude Include="..\..\src\RunQueue.hpp"> + <Filter>src</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <Natvis Include="DebugVis.natvis" /> diff --git a/profiler/src/RunQueue.cpp b/profiler/src/RunQueue.cpp new file mode 100644 index 00000000..42d07c17 --- /dev/null +++ b/profiler/src/RunQueue.cpp @@ -0,0 +1,31 @@ +#include "RunQueue.hpp" + +RunQueue::RunQueue() + : m_mainThread( std::this_thread::get_id() ) +{ +} + +void RunQueue::Queue( std::function<void()> cb, bool forceDelay ) +{ + if( !forceDelay && std::this_thread::get_id() == m_mainThread ) + { + cb(); + } + else + { + std::lock_guard<std::mutex> lock( m_lock ); + m_queue.emplace_back( cb ); + } +} + +void RunQueue::Run() +{ + std::unique_lock<std::mutex> lock( m_lock ); + if( !m_queue.empty() ) + { + std::vector<std::function<void()>> tmp; + std::swap( tmp, m_queue ); + lock.unlock(); + for( auto& cb : tmp ) cb(); + } +} diff --git a/profiler/src/RunQueue.hpp b/profiler/src/RunQueue.hpp new file mode 100644 index 00000000..a904ba62 --- /dev/null +++ b/profiler/src/RunQueue.hpp @@ -0,0 +1,23 @@ +#ifndef __RUNQUEUE_HPP__ +#define __RUNQUEUE_HPP__ + +#include <functional> +#include <mutex> +#include <thread> +#include <vector> + +class RunQueue +{ +public: + RunQueue(); + + void Queue( std::function<void()> cb, bool forceDelay = false ); + void Run(); + +private: + std::vector<std::function<void()>> m_queue; + std::mutex m_lock; + std::thread::id m_mainThread; +}; + +#endif diff --git a/profiler/src/main.cpp b/profiler/src/main.cpp index de2a955a..f7d374c5 100644 --- a/profiler/src/main.cpp +++ b/profiler/src/main.cpp @@ -53,6 +53,7 @@ #include "HttpRequest.hpp" #include "NativeWindow.hpp" #include "ResolvService.hpp" +#include "RunQueue.hpp" static void glfw_error_callback(int error, const char* description) { @@ -118,24 +119,14 @@ static std::atomic<ViewShutdown> viewShutdown { ViewShutdown::False }; static double animTime = 0; static float dpiScale = 1.f; static ImGuiTextFilter addrFilter, portFilter, progFilter; -static std::thread::id mainThread; -static std::vector<std::function<void()>> mainThreadTasks; -static std::mutex mainThreadLock; +static RunQueue mainThreadTasks; static uint32_t updateVersion = 0; static bool showReleaseNotes = false; static std::string releaseNotes; void RunOnMainThread( std::function<void()> cb, bool forceDelay = false ) { - if( !forceDelay && std::this_thread::get_id() == mainThread ) - { - cb(); - } - else - { - std::lock_guard<std::mutex> lock( mainThreadLock ); - mainThreadTasks.emplace_back( cb ); - } + mainThreadTasks.Queue( cb, forceDelay ); } static void SetupDPIScale( float scale, ImFont*& cb_fixedWidth, ImFont*& cb_bigFont, ImFont*& cb_smallFont ) @@ -274,8 +265,6 @@ int main( int argc, char** argv ) } } - mainThread = std::this_thread::get_id(); - updateThread = std::thread( [] { HttpRequest( "nereid.pl", "/tracy/version", 8099, [] ( int size, char* data ) { if( size == 4 ) @@ -390,14 +379,7 @@ int main( int argc, char** argv ) { 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(); - } + mainThreadTasks.Run(); } if( loadThread.joinable() ) loadThread.join(); |