[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50446] trunk/blender/source/blender: fix for crash in sequencer introduced with recent cache addition,

Campbell Barton ideasman42 at gmail.com
Thu Sep 6 06:45:28 CEST 2012


Revision: 50446
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50446
Author:   campbellbarton
Date:     2012-09-06 04:45:25 +0000 (Thu, 06 Sep 2012)
Log Message:
-----------
fix for crash in sequencer introduced with recent cache addition,
- running undo with metastrips would crash immediately.
- freeing a strip without a scene would crash (clipboard does this).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_sequencer.h
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/blenlib/BLI_path_util.h
    trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
    trunk/blender/source/blender/makesrna/intern/rna_sequencer_api.c

Modified: trunk/blender/source/blender/blenkernel/BKE_sequencer.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2012-09-06 03:08:47 UTC (rev 50445)
+++ trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2012-09-06 04:45:25 UTC (rev 50446)
@@ -199,7 +199,7 @@
 
 void BKE_sequencer_free_clipboard(void);
 
-void BKE_sequence_free(struct Scene *scene, struct Sequence *seq);
+void BKE_sequence_free(struct Scene *scene, struct Sequence *seq, const int do_cache);
 const char *BKE_sequence_give_name(struct Sequence *seq);
 void BKE_sequence_calc(struct Scene *scene, struct Sequence *seq);
 void BKE_sequence_calc_disp(struct Scene *scene, struct Sequence *seq);

Modified: trunk/blender/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequencer.c	2012-09-06 03:08:47 UTC (rev 50445)
+++ trunk/blender/source/blender/blenkernel/intern/sequencer.c	2012-09-06 04:45:25 UTC (rev 50446)
@@ -169,7 +169,7 @@
 	MEM_freeN(strip);
 }
 
-void BKE_sequence_free(Scene *scene, Sequence *seq)
+void BKE_sequence_free(Scene *scene, Sequence *seq, const int do_cache)
 {
 	if (seq->strip)
 		seq_free_strip(seq->strip);
@@ -205,21 +205,32 @@
 
 	/* free cached data used by this strip,
 	 * also invalidate cache for all dependent sequences
+	 *
+	 * be _very_ careful here, invalidating cache loops over the scene sequences and
+	 * assumes the listbase is valid for all strips, this may not be the case if lists are being freed.
+	 * this is optional BKE_sequence_invalidate_cache
 	 */
-	BKE_sequence_invalidate_cache(scene, seq);
+	if (do_cache) {
+		if (scene) {
+			BKE_sequence_invalidate_cache(scene, seq);
+		}
+	}
 
 	MEM_freeN(seq);
 }
 
+/* cache must be freed before calling this function
+ * since it leaves the seqbase in an invalid state */
 static void seq_free_sequence_recurse(Scene *scene, Sequence *seq)
 {
-	Sequence *iseq;
+	Sequence *iseq, *iseq_next;
 
-	for (iseq = seq->seqbase.first; iseq; iseq = iseq->next) {
+	for (iseq = seq->seqbase.first; iseq; iseq = iseq_next) {
+		iseq_next = iseq->next;
 		seq_free_sequence_recurse(scene, iseq);
 	}
 
-	BKE_sequence_free(scene, seq);
+	BKE_sequence_free(scene, seq, FALSE);
 }
 
 
@@ -240,7 +251,7 @@
 		seq_free_clipboard_recursive(seq);
 	}
 
-	BKE_sequence_free(NULL, seq_parent);
+	BKE_sequence_free(NULL, seq_parent, FALSE);
 }
 
 void BKE_sequencer_free_clipboard(void)
@@ -269,22 +280,21 @@
 void BKE_sequencer_editing_free(Scene *scene)
 {
 	Editing *ed = scene->ed;
-	MetaStack *ms;
 	Sequence *seq;
 
 	if (ed == NULL)
 		return;
 
+	/* this may not be the active scene!, could be smarter about this */
+	BKE_sequencer_cache_cleanup();
+
 	SEQ_BEGIN (ed, seq)
 	{
-		BKE_sequence_free(scene, seq);
+		BKE_sequence_free(scene, seq, FALSE);
 	}
 	SEQ_END
 
-	while ((ms = ed->metastack.first)) {
-		BLI_remlink(&ed->metastack, ms);
-		MEM_freeN(ms);
-	}
+	BLI_freelistN(&ed->metastack);
 
 	MEM_freeN(ed);
 

Modified: trunk/blender/source/blender/blenlib/BLI_path_util.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_path_util.h	2012-09-06 03:08:47 UTC (rev 50445)
+++ trunk/blender/source/blender/blenlib/BLI_path_util.h	2012-09-06 04:45:25 UTC (rev 50446)
@@ -97,7 +97,6 @@
 } bli_rebase_state;
 
 int BLI_rebase_path(char *abs, size_t abs_len, char *rel, size_t rel_len, const char *base_dir, const char *src_dir, const char *dest_dir);
-#define BKE_rebase_path BLI_rebase_path /* remove after a 2012 */
 
 char *BLI_last_slash(const char *string);
 int   BLI_add_slash(char *string);

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c	2012-09-06 03:08:47 UTC (rev 50445)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c	2012-09-06 04:45:25 UTC (rev 50446)
@@ -852,7 +852,7 @@
 	struct ImBuf *ibuf = NULL;
 	struct ImBuf *scope = NULL;
 	struct View2D *v2d = &ar->v2d;
-	int rectx, recty;
+	/* int rectx, recty; */ /* UNUSED */
 	float viewrectx, viewrecty;
 	float render_size = 0.0;
 	float proxy_size = 100.0;
@@ -874,8 +874,8 @@
 	viewrectx = (render_size * (float)scene->r.xsch) / 100.0f;
 	viewrecty = (render_size * (float)scene->r.ysch) / 100.0f;
 
-	rectx = viewrectx + 0.5f;
-	recty = viewrecty + 0.5f;
+	/* rectx = viewrectx + 0.5f; */ /* UNUSED */
+	/* recty = viewrecty + 0.5f; */ /* UNUSED */
 
 	if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
 		viewrectx *= scene->r.xasp / scene->r.yasp;

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c	2012-09-06 03:08:47 UTC (rev 50445)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c	2012-09-06 04:45:25 UTC (rev 50446)
@@ -613,7 +613,7 @@
 			BLI_remlink(lb, seq);
 			if (seq == last_seq) BKE_sequencer_active_set(scene, NULL);
 			if (seq->type == SEQ_TYPE_META) recurs_del_seq_flag(scene, &seq->seqbase, flag, 1);
-			BKE_sequence_free(scene, seq);
+			BKE_sequence_free(scene, seq, TRUE);
 		}
 		seq = seqn;
 	}
@@ -1812,7 +1812,7 @@
 				start_ofs += step;
 			}
 
-			BKE_sequence_free(scene, seq);
+			BKE_sequence_free(scene, seq, TRUE);
 			seq = seq->next;
 		}
 		else {
@@ -2010,7 +2010,7 @@
 	last_seq->seqbase.last = NULL;
 
 	BLI_remlink(ed->seqbasep, last_seq);
-	BKE_sequence_free(scene, last_seq);
+	BKE_sequence_free(scene, last_seq, TRUE);
 
 	/* emtpy meta strip, delete all effects depending on it */
 	for (seq = ed->seqbasep->first; seq; seq = seq->next)

Modified: trunk/blender/source/blender/makesrna/intern/rna_sequencer_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_sequencer_api.c	2012-09-06 03:08:47 UTC (rev 50445)
+++ trunk/blender/source/blender/makesrna/intern/rna_sequencer_api.c	2012-09-06 04:45:25 UTC (rev 50446)
@@ -170,7 +170,7 @@
 	if (seq->strip->stripdata->name[0] == '\0') {
 		BKE_report(reports, RPT_ERROR, "Sequences.new_image: unable to open image file");
 		BLI_remlink(&ed->seqbase, seq);
-		BKE_sequence_free(scene, seq);
+		BKE_sequence_free(scene, seq, FALSE);  /* cache won't have been generated */
 		return NULL;
 	}
 
@@ -315,7 +315,7 @@
 	Scene *scene = (Scene *)id;
 
 	BLI_remlink(&ed->seqbase, seq);
-	BKE_sequence_free(scene, seq);
+	BKE_sequence_free(scene, seq, TRUE);
 
 	WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene);
 }




More information about the Bf-blender-cvs mailing list