Skip to content

Commit

Permalink
Atomic flag
Browse files Browse the repository at this point in the history
  • Loading branch information
skyline75489 committed Nov 12, 2019
1 parent 722ba64 commit cc1dbc0
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 6 deletions.
14 changes: 9 additions & 5 deletions src/renderer/base/thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ RenderThread::RenderThread() :
_hEvent(nullptr),
_hPaintCompletedEvent(nullptr),
_fKeepRunning(true),
_fNextFrameRequested(false),
_hPaintEnabledEvent(nullptr)
{
_fNextFrameRequested.clear();
_fPainting.clear();
}

RenderThread::~RenderThread()
Expand Down Expand Up @@ -161,18 +162,21 @@ 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);

LOG_IF_FAILED(_pRenderer->PaintFrame());

SetEvent(_hPaintCompletedEvent);

// extra check before we sleep since it's a "long" activity, relatively speaking.
Expand All @@ -193,7 +197,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;
}

Expand Down
2 changes: 1 addition & 1 deletion src/renderer/base/thread.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
}

0 comments on commit cc1dbc0

Please sign in to comment.