From aae70fe8c6d46b1acdc458cdb50d31993e46b7f1 Mon Sep 17 00:00:00 2001 From: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> Date: Tue, 10 Mar 2015 19:09:01 -0400 Subject: [PATCH] video: fix mutexes deadlock --- src/private/shmrenderer.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/private/shmrenderer.cpp b/src/private/shmrenderer.cpp index 9a327dab..a014ffbc 100644 --- a/src/private/shmrenderer.cpp +++ b/src/private/shmrenderer.cpp @@ -128,8 +128,10 @@ bool Video::ShmRendererPrivate::renderToBitmap() return false; } - if(!VideoRendererManager::instance()->startStopMutex()->tryLock()) + if(!VideoRendererManager::instance()->startStopMutex()->tryLock()) { + shmUnlock(); return false; + } // wait for a new buffer while (m_BufferGen == m_pShmArea->m_BufferGen) { @@ -169,6 +171,7 @@ bool Video::ShmRendererPrivate::renderToBitmap() if (!q_ptr->resizeShm()) { qDebug() << "Could not resize shared memory"; VideoRendererManager::instance()->startStopMutex()->unlock(); + shmUnlock(); return false; } @@ -176,10 +179,10 @@ bool Video::ShmRendererPrivate::renderToBitmap() 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); m_BufferGen = m_pShmArea->m_BufferGen; - shmUnlock(); static_cast<Video::Renderer*>(q_ptr)->d_ptr->updateFrameIndex(); - VideoRendererManager::instance()->startStopMutex()->unlock(); + shmUnlock(); + return true; #else return false; @@ -306,8 +309,8 @@ void Video::ShmRendererPrivate::timedEvents() ///Start the rendering loop void Video::ShmRenderer::startRendering() { + QMutexLocker locker {mutex()}; VideoRendererManager::instance()->startStopMutex()->lock(); - QMutexLocker locker(mutex()); startShm(); if (!d_ptr->m_pTimer) { d_ptr->m_pTimer = new QTimer(nullptr); @@ -331,8 +334,8 @@ void Video::ShmRenderer::startRendering() ///Stop the rendering loop void Video::ShmRenderer::stopRendering() { + QMutexLocker locker {mutex()}; VideoRendererManager::instance()->startStopMutex()->lock(); - QMutexLocker locker(mutex()); setRendering(false); qDebug() << "Stopping rendering on" << this; if (d_ptr->m_pTimer) -- GitLab