[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32854] trunk/blender/source/blender: bugfix [#24508] Render and changing scenes crashes.

Campbell Barton ideasman42 at gmail.com
Wed Nov 3 12:14:02 CET 2010


Revision: 32854
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32854
Author:   campbellbarton
Date:     2010-11-03 12:14:02 +0100 (Wed, 03 Nov 2010)

Log Message:
-----------
bugfix [#24508] Render and changing scenes crashes.
The scenes 'Render' is kept by blender while blender runs but the callbacks were not cleared when the render was done.
In this case the callback would reference a freed render job.

This isn't normally a problem because on re-rendering new callbacks are set, however the sequencer can render a previously rendered scene without setting up callbacks.
Simple fix is to to dummy callbacks applied onto the scenes 'Render' struct once its finished.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/render/extern/include/RE_pipeline.h
    trunk/blender/source/blender/render/intern/source/pipeline.c

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c	2010-11-03 08:55:14 UTC (rev 32853)
+++ trunk/blender/source/blender/editors/render/render_internal.c	2010-11-03 11:14:02 UTC (rev 32854)
@@ -573,8 +573,12 @@
 
 static void render_endjob(void *rjv)
 {
-	RenderJob *rj= rjv;
+	RenderJob *rj= rjv;	
 
+	/* this render may be used again by the sequencer without the active 'Render' where the callbacks
+	 * would be re-assigned. assign dummy callbacks to avoid referencing freed renderjobs bug [#24508] */
+	RE_InitRenderCB(rj->re);
+
 	if(rj->main != G.main)
 		free_main(rj->main);
 

Modified: trunk/blender/source/blender/render/extern/include/RE_pipeline.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2010-11-03 08:55:14 UTC (rev 32853)
+++ trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2010-11-03 11:14:02 UTC (rev 32854)
@@ -159,6 +159,9 @@
 /* returns 1 while render is working (or renders called from within render) */
 int RE_RenderInProgress(struct Render *re);
 
+/* assign default dummy callbacks */
+void RE_InitRenderCB(struct Render *re);
+
 /* use free render as signal to do everything over (previews) */
 void RE_FreeRender (struct Render *re);
 /* only called on exit */

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c	2010-11-03 08:55:14 UTC (rev 32853)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c	2010-11-03 11:14:02 UTC (rev 32854)
@@ -1158,6 +1158,18 @@
 		BLI_rw_mutex_init(&re->resultmutex);
 	}
 	
+	RE_InitRenderCB(re);
+
+	/* init some variables */
+	re->ycor= 1.0f;
+	
+	return re;
+}
+
+/* called for new renders and when finishing rendering so
+ * we calways have valid callbacks on a render */
+void RE_InitRenderCB(Render *re)
+{
 	/* set default empty callbacks */
 	re->display_init= result_nothing;
 	re->display_clear= result_nothing;
@@ -1171,11 +1183,6 @@
 		re->stats_draw= stats_nothing;
 	/* clear callback handles */
 	re->dih= re->dch= re->ddh= re->sdh= re->prh= re->tbh= re->erh= NULL;
-	
-	/* init some variables */
-	re->ycor= 1.0f;
-	
-	return re;
 }
 
 /* only call this while you know it will remove the link too */





More information about the Bf-blender-cvs mailing list