diff --git a/public/client/TracyProfiler.cpp b/public/client/TracyProfiler.cpp index 8fee216a..e73b7379 100644 --- a/public/client/TracyProfiler.cpp +++ b/public/client/TracyProfiler.cpp @@ -2067,7 +2067,7 @@ void Profiler::Worker() if( !connActive ) break; } if ( !m_symbolQueue.empty() ) - m_symbolQueue.notify(); + m_symbolQueueSignal.notify_one(); if( !connActive || ShouldExit() ) break; } if( ShouldExit() ) break; @@ -3659,7 +3659,10 @@ void Profiler::SymbolWorker() s_symbolThreadGone.store( true, std::memory_order_release ); return; } - m_symbolQueue.wait( 20 ); + // Symbol Worker is idle: wait for Profiler Worker to enqueue more symbol queries + // (having a timeout ensures progress even if notifications are missed) + std::unique_lock lock( m_symbolQueueMutex ); + m_symbolQueueSignal.wait_for( lock, std::chrono::milliseconds( 20 ), [this]() { return !m_symbolQueue.empty(); } ); } } } diff --git a/public/client/TracyProfiler.hpp b/public/client/TracyProfiler.hpp index 7ddd244a..b0059d96 100644 --- a/public/client/TracyProfiler.hpp +++ b/public/client/TracyProfiler.hpp @@ -1051,6 +1051,8 @@ private: #endif SPSCQueue m_symbolQueue; + std::condition_variable m_symbolQueueSignal; + std::mutex m_symbolQueueMutex; std::atomic m_frameCount; std::atomic m_isConnected; diff --git a/public/client/tracy_SPSCQueue.h b/public/client/tracy_SPSCQueue.h index 88d49936..310ffd3d 100644 --- a/public/client/tracy_SPSCQueue.h +++ b/public/client/tracy_SPSCQueue.h @@ -24,9 +24,7 @@ SOFTWARE. #include #include -#include #include -#include #include #include // std::enable_if, std::is_*_constructible @@ -121,21 +119,6 @@ public: size_t capacity() const noexcept { return capacity_ - 1; } - void notify() - { - pending_.notify_one(); - } - - void wait( int timeout_ms ) - { - // enforce a minimum timeout, this way there's no need to be overzealous - // about missing notifications - timeout_ms = ( timeout_ms > 0 ) ? timeout_ms : 1; - std::chrono::milliseconds timeout{ timeout_ms }; - std::unique_lock lock( mtx_ ); - pending_.wait_for( lock, timeout, [this]() { return !empty(); } ); - } - private: static constexpr size_t kCacheLineSize = 64;