From 50ef801a79b5c280ecd02f89e9a9b4533e4102c4 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Wed, 13 May 2020 00:10:58 +0200 Subject: [PATCH] Fix T76320: Thread race condition on undo with prefetching enabled Stop prefetch jobs before undoing. Reviewed By: brecht Differential Revision: https://developer.blender.org/D7633 --- source/blender/blenkernel/BKE_sequencer.h | 1 + source/blender/blenkernel/intern/seqprefetch.c | 9 +++++++++ source/blender/windowmanager/intern/wm_jobs.c | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h index 42032348370..18e5f3aa402 100644 --- a/source/blender/blenkernel/BKE_sequencer.h +++ b/source/blender/blenkernel/BKE_sequencer.h @@ -360,6 +360,7 @@ bool BKE_sequencer_cache_is_full(struct Scene *scene); * ********************************************************************** */ void BKE_sequencer_prefetch_start(const SeqRenderData *context, float cfra, float cost); +void BKE_sequencer_prefetch_stop_all(); void BKE_sequencer_prefetch_stop(struct Scene *scene); void BKE_sequencer_prefetch_free(struct Scene *scene); bool BKE_sequencer_prefetch_need_redraw(struct Main *bmain, struct Scene *scene); diff --git a/source/blender/blenkernel/intern/seqprefetch.c b/source/blender/blenkernel/intern/seqprefetch.c index 5eff6aaac90..d2be7653cee 100644 --- a/source/blender/blenkernel/intern/seqprefetch.c +++ b/source/blender/blenkernel/intern/seqprefetch.c @@ -42,6 +42,7 @@ #include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_context.h" +#include "BKE_global.h" #include "BKE_layer.h" #include "BKE_lib_id.h" #include "BKE_main.h" @@ -242,6 +243,14 @@ static void seq_prefetch_update_area(PrefetchJob *pfjob) } } +void BKE_sequencer_prefetch_stop_all(void) +{ + /*TODO(Richard): Use wm_jobs for prefetch, or pass main. */ + for (Scene *scene = G.main->scenes.first; scene; scene = scene->id.next) { + BKE_sequencer_prefetch_stop(scene); + } +} + /* Use also to update scene and context changes * This function should almost always be called by cache invalidation, not directly. */ diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index 245a8f28fec..c10f03f3dab 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -35,6 +35,7 @@ #include "BKE_context.h" #include "BKE_global.h" +#include "BKE_sequencer.h" #include "WM_api.h" #include "WM_types.h" @@ -558,6 +559,9 @@ void WM_jobs_kill_all(wmWindowManager *wm) while ((wm_job = wm->jobs.first)) { wm_jobs_kill_job(wm, wm_job); } + + /* This job will be automatically restarted */ + BKE_sequencer_prefetch_stop_all(); } /* wait until every job ended, except for one owner (used in undo to keep screen job alive) */