diff --git a/src/renderer/base/thread.cpp b/src/renderer/base/thread.cpp index 226b8e5417d0..f9a73da05c06 100644 --- a/src/renderer/base/thread.cpp +++ b/src/renderer/base/thread.cpp @@ -15,9 +15,10 @@ RenderThread::RenderThread() : _hEvent(nullptr), _hPaintCompletedEvent(nullptr), _fKeepRunning(true), - _fNextFrameRequested(false), _hPaintEnabledEvent(nullptr) { + _fNextFrameRequested.clear(); + _fPainting.clear(); } RenderThread::~RenderThread() @@ -161,13 +162,15 @@ DWORD WINAPI RenderThread::_ThreadProc() WaitForSingleObject(_hPaintEnabledEvent, INFINITE); // Skip waiting if next frame is requested. - if (!_fNextFrameRequested) + if (_fNextFrameRequested.test_and_set(std::memory_order_relaxed)) + { + _fNextFrameRequested.clear(std::memory_order_relaxed); + } + else { WaitForSingleObject(_hEvent, INFINITE); } - _fNextFrameRequested = false; - ResetEvent(_hPaintCompletedEvent); _fPainting.test_and_set(std::memory_order_acquire); @@ -193,7 +196,7 @@ void RenderThread::NotifyPaint() // to indicate we want to paint next frame immediately. if (_fPainting.test_and_set(std::memory_order_acquire)) { - _fNextFrameRequested = true; + _fNextFrameRequested.test_and_set(std::memory_order_relaxed); return; } diff --git a/src/renderer/base/thread.hpp b/src/renderer/base/thread.hpp index c6fd5b195924..3e991f618360 100644 --- a/src/renderer/base/thread.hpp +++ b/src/renderer/base/thread.hpp @@ -47,7 +47,7 @@ namespace Microsoft::Console::Render IRenderer* _pRenderer; // Non-ownership pointer bool _fKeepRunning; - bool _fNextFrameRequested; + std::atomic_flag _fNextFrameRequested; std::atomic_flag _fPainting; }; }