From 3c2da0a966bdb1870e0283b6ba3f72f5868b0ffc Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 25 Mar 2021 23:05:55 +1100 Subject: [PATCH] cache: fixed race condition --- app/render/previewautocacher.cpp | 12 ++++++++++++ app/render/previewautocacher.h | 1 + 2 files changed, 13 insertions(+) diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 7ccefa594..eed338fe9 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -248,6 +248,7 @@ void PreviewAutoCacher::SingleFrameFinished() RenderTicketWatcher* watcher = static_cast(sender()); RenderTicketPtr passthrough = watcher->property("passthrough").value(); passthrough->Finish(watcher->GetTicket()->Get(), watcher->GetTicket()->WasCancelled()); + single_frame_tasks_.removeOne(watcher); delete watcher; } @@ -498,6 +499,7 @@ void PreviewAutoCacher::TryRender() watcher->setProperty("passthrough", QVariant::fromValue(single_frame_render_)); connect(watcher, &RenderTicketWatcher::Finished, this, &PreviewAutoCacher::SingleFrameFinished); + single_frame_tasks_.append(watcher); single_frame_render_->Start(); @@ -604,6 +606,16 @@ void PreviewAutoCacher::SetViewerNode(Sequence *viewer_node) // be in the cache for later use. ClearVideoDownloadQueue(true); + // Wait for any single frame renders to finish + foreach (RenderTicketWatcher* watcher, single_frame_tasks_) { + watcher->Cancel(); + watcher->WaitForFinished(); + } + single_frame_tasks_.clear(); + + // Clear any single frame render that might be queued + single_frame_render_ = nullptr; + // No longer caching any hashes currently_caching_hashes_.clear(); diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index fa4e84a56..78b28ce6c 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -152,6 +152,7 @@ private: QMap audio_tasks_; QMap video_tasks_; QMap video_download_tasks_; + QVector single_frame_tasks_; QVector currently_caching_hashes_;