diff --git a/profiler/build/win32/Tracy.vcxproj b/profiler/build/win32/Tracy.vcxproj index 78fd69e3..adfa6fa7 100644 --- a/profiler/build/win32/Tracy.vcxproj +++ b/profiler/build/win32/Tracy.vcxproj @@ -184,6 +184,7 @@ + diff --git a/profiler/build/win32/Tracy.vcxproj.filters b/profiler/build/win32/Tracy.vcxproj.filters index b58d4c81..76547827 100644 --- a/profiler/build/win32/Tracy.vcxproj.filters +++ b/profiler/build/win32/Tracy.vcxproj.filters @@ -302,6 +302,9 @@ server + + server + diff --git a/server/TracyFileRead.hpp b/server/TracyFileRead.hpp index 270c86b0..33f79cd0 100644 --- a/server/TracyFileRead.hpp +++ b/server/TracyFileRead.hpp @@ -10,6 +10,7 @@ #include #include "TracyFileHeader.hpp" +#include "TracyYield.hpp" #include "../common/tracy_lz4.hpp" #include "../common/TracyForceInline.hpp" @@ -188,7 +189,7 @@ private: { if( m_exit.load( std::memory_order_relaxed ) == true ) return; if( m_signalSwitch.load( std::memory_order_relaxed ) == true ) break; - std::this_thread::yield(); + YieldThread(); } m_signalSwitch.store( false, std::memory_order_relaxed ); std::swap( m_buf, m_second ); @@ -212,7 +213,7 @@ private: if( m_offset == BufSize ) { m_signalSwitch.store( true, std::memory_order_relaxed ); - while( m_signalAvailable.load( std::memory_order_acquire ) == false ) { std::this_thread::yield(); } + while( m_signalAvailable.load( std::memory_order_acquire ) == false ) { YieldThread(); } m_signalAvailable.store( false, std::memory_order_relaxed ); } @@ -231,7 +232,7 @@ private: if( m_offset == BufSize ) { m_signalSwitch.store( true, std::memory_order_relaxed ); - while( m_signalAvailable.load( std::memory_order_acquire ) == false ) { std::this_thread::yield(); } + while( m_signalAvailable.load( std::memory_order_acquire ) == false ) { YieldThread(); } m_signalAvailable.store( false, std::memory_order_relaxed ); } diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index a1dc819d..ecbd0ca7 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -34,6 +34,7 @@ #include "TracyTaskDispatch.hpp" #include "TracyVersion.hpp" #include "TracyWorker.hpp" +#include "TracyYield.hpp" #include "tracy_flat_hash_map.hpp" @@ -1384,7 +1385,7 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks ) } } if( idx >= 0 ) break; - std::this_thread::yield(); + YieldThread(); } if( data[idx].bufsz < sz ) diff --git a/server/TracyYield.hpp b/server/TracyYield.hpp new file mode 100644 index 00000000..4eb3851a --- /dev/null +++ b/server/TracyYield.hpp @@ -0,0 +1,26 @@ +#ifndef __TRACYYIELD_HPP__ +#define __TRACYYIELD_HPP__ + +#if defined __SSE2__ || defined _M_AMD64 || _M_IX86_FP == 2 +# include +#else +# include +#endif + +#include "../common/TracyForceInline.hpp" + +namespace tracy +{ + +static tracy_force_inline void YieldThread() +{ +#if defined __SSE2__ || defined _M_AMD64 || _M_IX86_FP == 2 + _mm_pause(); +#else + std::this_thread::yield(); +#endif +} + +} + +#endif