diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2019-04-08 21:48:06 +0300 |
---|---|---|
committer | Konstantin Ritt <ritt.ks@gmail.com> | 2019-04-09 04:27:08 +0000 |
commit | da26ff2787b7ab2b8535e6d7725e4ed3496c19aa (patch) | |
tree | 3ba45a4721da7cf0fad3fa5504b1175da63f4bc1 | |
parent | 6b41334b099dd39372b9309d543e7fa6c45a6dd0 (diff) |
BatchRenderer: fix race conditions due to missing/late mutex locks
Change-Id: Id439ef3e4c3740b4c3de9345f1006df2dd70428b
Reviewed-by: Rebecca Worledge <rebecca.worledge@theqtcompany.com>
-rw-r--r-- | src/imports/rasterrenderer/batchrenderer.cpp | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/src/imports/rasterrenderer/batchrenderer.cpp b/src/imports/rasterrenderer/batchrenderer.cpp index eb0cc44..1d1570d 100644 --- a/src/imports/rasterrenderer/batchrenderer.cpp +++ b/src/imports/rasterrenderer/batchrenderer.cpp @@ -65,6 +65,8 @@ BatchRenderer::BatchRenderer() BatchRenderer::~BatchRenderer() { + QMutexLocker mlocker(&m_mutex); + qDeleteAll(m_animData); } @@ -120,9 +122,10 @@ void BatchRenderer::deregisterAnimator(LottieAnimation *animator) bool BatchRenderer::gotoFrame(LottieAnimation *animator, int frame) { + QMutexLocker mlocker(&m_mutex); + Entry *entry = m_animData.value(animator, nullptr); if (entry) { - QMutexLocker mlocker(&m_mutex); qCDebug(lcLottieQtBodymovinRenderThread) << "Animator:" << static_cast<void*>(animator) << "Goto frame:" << frame; @@ -163,11 +166,6 @@ BMBase *BatchRenderer::getFrame(LottieAnimation *animator, int frameNumber) void BatchRenderer::prerender(Entry *animEntry) { while (animEntry->frameCache.count() < m_cacheSize) { - // It may be that the animator has deregistered itself while - // te mutex was locked. In that case we cannot render here anymore - if (!animEntry->bmTreeBlueprint) - break; - if (!animEntry->frameCache.contains(animEntry->currentFrame)) { BMBase *bmTree = new BMBase(*animEntry->bmTreeBlueprint); @@ -197,12 +195,13 @@ void BatchRenderer::prerender(Entry *animEntry) void BatchRenderer::frameRendered(LottieAnimation *animator, int frameNumber) { + QMutexLocker mlocker(&m_mutex); + Entry *entry = m_animData.value(animator, nullptr); if (entry) { qCDebug(lcLottieQtBodymovinRenderThread) << "Animator:" << static_cast<void*>(animator) << "Remove frame from cache" << frameNumber; - QMutexLocker mlocker(&m_mutex); BMBase *root = entry->frameCache.value(frameNumber, nullptr); delete root; entry->frameCache.remove(frameNumber); |