Skip to content
Snippets Groups Projects
Commit aae70fe8 authored by Guillaume Roguez's avatar Guillaume Roguez
Browse files

video: fix mutexes deadlock

parent 6ff2a367
Branches
Tags
No related merge requests found
...@@ -128,8 +128,10 @@ bool Video::ShmRendererPrivate::renderToBitmap() ...@@ -128,8 +128,10 @@ bool Video::ShmRendererPrivate::renderToBitmap()
return false; return false;
} }
if(!VideoRendererManager::instance()->startStopMutex()->tryLock()) if(!VideoRendererManager::instance()->startStopMutex()->tryLock()) {
shmUnlock();
return false; return false;
}
// wait for a new buffer // wait for a new buffer
while (m_BufferGen == m_pShmArea->m_BufferGen) { while (m_BufferGen == m_pShmArea->m_BufferGen) {
...@@ -169,6 +171,7 @@ bool Video::ShmRendererPrivate::renderToBitmap() ...@@ -169,6 +171,7 @@ bool Video::ShmRendererPrivate::renderToBitmap()
if (!q_ptr->resizeShm()) { if (!q_ptr->resizeShm()) {
qDebug() << "Could not resize shared memory"; qDebug() << "Could not resize shared memory";
VideoRendererManager::instance()->startStopMutex()->unlock(); VideoRendererManager::instance()->startStopMutex()->unlock();
shmUnlock();
return false; return false;
} }
...@@ -176,10 +179,10 @@ bool Video::ShmRendererPrivate::renderToBitmap() ...@@ -176,10 +179,10 @@ bool Video::ShmRendererPrivate::renderToBitmap()
static_cast<Video::Renderer*>(q_ptr)->d_ptr->otherFrame().resize(m_pShmArea->m_BufferSize); static_cast<Video::Renderer*>(q_ptr)->d_ptr->otherFrame().resize(m_pShmArea->m_BufferSize);
memcpy(static_cast<Video::Renderer*>(q_ptr)->d_ptr->otherFrame().data(),m_pShmArea->m_Data,m_pShmArea->m_BufferSize); memcpy(static_cast<Video::Renderer*>(q_ptr)->d_ptr->otherFrame().data(),m_pShmArea->m_Data,m_pShmArea->m_BufferSize);
m_BufferGen = m_pShmArea->m_BufferGen; m_BufferGen = m_pShmArea->m_BufferGen;
shmUnlock();
static_cast<Video::Renderer*>(q_ptr)->d_ptr->updateFrameIndex(); static_cast<Video::Renderer*>(q_ptr)->d_ptr->updateFrameIndex();
VideoRendererManager::instance()->startStopMutex()->unlock(); VideoRendererManager::instance()->startStopMutex()->unlock();
shmUnlock();
return true; return true;
#else #else
return false; return false;
...@@ -306,8 +309,8 @@ void Video::ShmRendererPrivate::timedEvents() ...@@ -306,8 +309,8 @@ void Video::ShmRendererPrivate::timedEvents()
///Start the rendering loop ///Start the rendering loop
void Video::ShmRenderer::startRendering() void Video::ShmRenderer::startRendering()
{ {
QMutexLocker locker {mutex()};
VideoRendererManager::instance()->startStopMutex()->lock(); VideoRendererManager::instance()->startStopMutex()->lock();
QMutexLocker locker(mutex());
startShm(); startShm();
if (!d_ptr->m_pTimer) { if (!d_ptr->m_pTimer) {
d_ptr->m_pTimer = new QTimer(nullptr); d_ptr->m_pTimer = new QTimer(nullptr);
...@@ -331,8 +334,8 @@ void Video::ShmRenderer::startRendering() ...@@ -331,8 +334,8 @@ void Video::ShmRenderer::startRendering()
///Stop the rendering loop ///Stop the rendering loop
void Video::ShmRenderer::stopRendering() void Video::ShmRenderer::stopRendering()
{ {
QMutexLocker locker {mutex()};
VideoRendererManager::instance()->startStopMutex()->lock(); VideoRendererManager::instance()->startStopMutex()->lock();
QMutexLocker locker(mutex());
setRendering(false); setRendering(false);
qDebug() << "Stopping rendering on" << this; qDebug() << "Stopping rendering on" << this;
if (d_ptr->m_pTimer) if (d_ptr->m_pTimer)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment