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