[Bf-blender-cvs] [0084745] multiview: Fix unfreed memory when RenderResult were requested to be filled with all views

Dalai Felinto noreply at git.blender.org
Wed Sep 10 23:16:34 CEST 2014


Commit: 008474521e41ac82009363487481bce901241832
Author: Dalai Felinto
Date:   Wed Sep 10 23:10:48 2014 +0200
Branches: multiview
https://developer.blender.org/rB008474521e41ac82009363487481bce901241832

Fix unfreed memory when RenderResult were requested to be filled with all views

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

M	source/blender/render/extern/include/RE_pipeline.h
M	source/blender/render/intern/source/pipeline.c
M	source/blender/render/intern/source/render_result.c

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

diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 7f17281..fcb164b 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -208,8 +208,9 @@ void RE_FreeRenderResult(struct RenderResult *rr);
 struct RenderResult *RE_AcquireResultRead(struct Render *re);
 struct RenderResult *RE_AcquireResultWrite(struct Render *re);
 void RE_ReleaseResult(struct Render *re);
+void RE_AcquireResultImageViews(struct Render *re, struct RenderResult *rr);
+void RE_ReleaseResultImageViews(struct Render *re, struct RenderResult *rr);
 void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr, const int view_id);
-void RE_AcquireResultViews(struct Render *re, struct RenderResult *rr);
 void RE_ReleaseResultImage(struct Render *re);
 void RE_SwapResult(struct Render *re, struct RenderResult **rr);
 struct RenderStats *RE_GetStats(struct Render *re);
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 13e7743..b71f062 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -319,9 +319,10 @@ Scene *RE_GetScene(Render *re)
 	return NULL;
 }
 
-/* fill provided result struct with a COPY of thew views of what is done so far
- * remember to free the RenderResult.views ListBase after using the renderresult */
-void RE_AcquireResultViews(Render *re, RenderResult *rr)
+/* Same as RE_AcquireResultImage but creating the necessary views to store the result
+ * fill provided result struct with a copy of thew views of what is done so far the
+ * RenderResult.views ListBase needs to be freed after with RE_ReleaseResultViews */
+void RE_AcquireResultImageViews(Render *re, RenderResult *rr)
 {
 	memset(rr, 0, sizeof(RenderResult));
 
@@ -364,13 +365,20 @@ void RE_AcquireResultViews(Render *re, RenderResult *rr)
 	}
 }
 
+/* clear temporary renderresult struct */
+void RE_ReleaseResultImageViews(Render *re, RenderResult *rr)
+{
+	if (re) {
+		if (rr) {
+			render_result_views_shallowdelete(rr);
+		}
+		BLI_rw_mutex_unlock(&re->resultmutex);
+	}
+}
+
 /* fill provided result struct with what's currently active or done */
 void RE_AcquireResultImage(Render *re, RenderResult *rr, const int view_id)
 {
-	/* deal with special case separatedly */
-	if (view_id == -1)
-		return RE_AcquireResultViews(re, rr);
-
 	memset(rr, 0, sizeof(RenderResult));
 
 	if (re) {
@@ -3297,7 +3305,7 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
 	double render_time;
 	bool ok = true;
 
-	RE_AcquireResultImage(re, &rres, -1);
+	RE_AcquireResultImageViews(re, &rres);
 
 	/* write movie or image */
 	if (BKE_imtype_is_movie(scene->r.im_format.imtype)) {
@@ -3314,7 +3322,7 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
 		ok = RE_WriteRenderViewsImage(re->reports, &rres, scene, true, name);
 	}
 	
-	RE_ReleaseResultImage(re);
+	RE_ReleaseResultImageViews(re, &rres);
 
 	render_time = re->i.lastframetime;
 	re->i.lastframetime = PIL_check_seconds_timer() - re->i.starttime;
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index e8fd13f..0f029e8 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -169,7 +169,7 @@ void render_result_views_shallowcopy(RenderResult *dst, RenderResult *src)
 	for (rview = (RenderView *)src->views.first; rview; rview = rview->next) {
 		RenderView *rv;
 
-		rv = MEM_callocN(sizeof(RenderView), "new render view");
+		rv = MEM_mallocN(sizeof(RenderView), "new render view");
 		BLI_addtail(&dst->views, rv);
 
 		BLI_strncpy(rv->name, rview->name, sizeof(rv->name));




More information about the Bf-blender-cvs mailing list