Give the condition waits proper conditions

This commit is contained in:
Jupeyy 2022-02-15 16:27:53 +01:00
parent 007e632530
commit 8cbff50461
2 changed files with 8 additions and 5 deletions

View file

@ -61,6 +61,7 @@ void CGraphicsBackend_Threaded::ThreadFunc(void *pUser)
auto *pSelf = (CGraphicsBackend_Threaded *)pUser; auto *pSelf = (CGraphicsBackend_Threaded *)pUser;
std::unique_lock<std::mutex> Lock(pSelf->m_BufferSwapMutex); std::unique_lock<std::mutex> Lock(pSelf->m_BufferSwapMutex);
// notify, that the thread started // notify, that the thread started
pSelf->m_Started = true;
pSelf->m_BufferDoneCond.notify_all(); pSelf->m_BufferDoneCond.notify_all();
while(!pSelf->m_Shutdown) while(!pSelf->m_Shutdown)
{ {
@ -75,11 +76,12 @@ void CGraphicsBackend_Threaded::ThreadFunc(void *pUser)
pSelf->m_pBuffer = nullptr; pSelf->m_pBuffer = nullptr;
pSelf->m_BufferInProcess.store(false, std::memory_order_relaxed); pSelf->m_BufferInProcess.store(false, std::memory_order_relaxed);
pSelf->m_BufferDoneCond.notify_all(); pSelf->m_BufferDoneCond.notify_all();
}
#if defined(CONF_VIDEORECORDER) #if defined(CONF_VIDEORECORDER)
if(IVideo::Current()) if(IVideo::Current())
IVideo::Current()->NextVideoFrameThread(); IVideo::Current()->NextVideoFrameThread();
#endif #endif
}
} }
} }
@ -97,7 +99,7 @@ void CGraphicsBackend_Threaded::StartProcessor(ICommandProcessor *pProcessor)
std::unique_lock<std::mutex> Lock(m_BufferSwapMutex); std::unique_lock<std::mutex> Lock(m_BufferSwapMutex);
m_Thread = thread_init(ThreadFunc, this, "Graphics thread"); m_Thread = thread_init(ThreadFunc, this, "Graphics thread");
// wait for the thread to start // wait for the thread to start
m_BufferDoneCond.wait(Lock); m_BufferDoneCond.wait(Lock, [this]() -> bool { return m_Started; });
} }
void CGraphicsBackend_Threaded::StopProcessor() void CGraphicsBackend_Threaded::StopProcessor()
@ -127,7 +129,7 @@ bool CGraphicsBackend_Threaded::IsIdle() const
void CGraphicsBackend_Threaded::WaitForIdle() void CGraphicsBackend_Threaded::WaitForIdle()
{ {
std::unique_lock<std::mutex> Lock(m_BufferSwapMutex); std::unique_lock<std::mutex> Lock(m_BufferSwapMutex);
if(m_pBuffer != nullptr) while(m_pBuffer != nullptr)
m_BufferDoneCond.wait(Lock); m_BufferDoneCond.wait(Lock);
} }

View file

@ -72,6 +72,7 @@ private:
std::condition_variable m_BufferDoneCond; std::condition_variable m_BufferDoneCond;
CCommandBuffer *m_pBuffer; CCommandBuffer *m_pBuffer;
std::atomic_bool m_Shutdown; std::atomic_bool m_Shutdown;
bool m_Started = false;
std::atomic_bool m_BufferInProcess; std::atomic_bool m_BufferInProcess;
void *m_Thread; void *m_Thread;