[Bf-blender-cvs] [50ef801a79b] blender-v2.83-release: Fix T76320: Thread race condition on undo with prefetching enabled

Richard Antalik noreply at git.blender.org
Wed May 13 00:13:40 CEST 2020


Commit: 50ef801a79b5c280ecd02f89e9a9b4533e4102c4
Author: Richard Antalik
Date:   Wed May 13 00:10:58 2020 +0200
Branches: blender-v2.83-release
https://developer.blender.org/rB50ef801a79b5c280ecd02f89e9a9b4533e4102c4

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

===================================================================

M	source/blender/blenkernel/BKE_sequencer.h
M	source/blender/blenkernel/intern/seqprefetch.c
M	source/blender/windowmanager/intern/wm_jobs.c

===================================================================

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) */



More information about the Bf-blender-cvs mailing list