[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53969] trunk/blender/source/blender/ render/intern/source/multires_bake.c: Multires baker: fix memory leak caused by threading issues

Sergey Sharybin sergey.vfx at gmail.com
Mon Jan 21 19:34:16 CET 2013


Revision: 53969
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53969
Author:   nazgul
Date:     2013-01-21 18:34:14 +0000 (Mon, 21 Jan 2013)
Log Message:
-----------
Multires baker: fix memory leak caused by threading issues

Didn't notice this before because of non-working guarded allocation
at the time threading was added to multires baker.

Modified Paths:
--------------
    trunk/blender/source/blender/render/intern/source/multires_bake.c

Modified: trunk/blender/source/blender/render/intern/source/multires_bake.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/multires_bake.c	2013-01-21 18:19:34 UTC (rev 53968)
+++ trunk/blender/source/blender/render/intern/source/multires_bake.c	2013-01-21 18:34:14 UTC (rev 53969)
@@ -428,6 +428,27 @@
 	return NULL;
 }
 
+/* some of arrays inside ccgdm are lazy-initialized, which will generally
+ * require lock around accessing such data
+ * this function will ensure all arrays are allocated before threading started
+ */
+static void init_ccgdm_arrays(DerivedMesh *dm)
+{
+	CCGElem **grid_data;
+	CCGKey key;
+	int grid_size;
+	int *grid_offset;
+
+	grid_size = dm->getGridSize(dm);
+	grid_data = dm->getGridData(dm);
+	grid_offset = dm->getGridOffset(dm);
+	dm->getGridKey(dm, &key);
+
+	(void) grid_data;
+	(void) grid_data;
+	(void) grid_offset;
+}
+
 static void do_multires_bake(MultiresBakeRender *bkr, Image *ima, int require_tangent, MPassKnownData passKnownData,
                              MInitBakeData initBakeData, MApplyBakeData applyBakeData, MFreeBakeData freeBakeData)
 {
@@ -467,6 +488,8 @@
 
 		handles = MEM_callocN(tot_thread * sizeof(MultiresBakeThread), "do_multires_bake handles");
 
+		init_ccgdm_arrays(bkr->hires_dm);
+
 		/* faces queue */
 		queue.cur_face = 0;
 		queue.tot_face = tot_face;
@@ -515,6 +538,8 @@
 		if (freeBakeData)
 			freeBakeData(bake_data);
 
+		MEM_freeN(handles);
+
 		BKE_image_release_ibuf(ima, ibuf, NULL);
 	}
 }
@@ -673,6 +698,7 @@
 				smd.subdivType = ME_SIMPLE_SUBSURF;
 
 			height_data->ssdm = subsurf_make_derived_from_derived(bkr->lores_dm, &smd, NULL, 0);
+			init_ccgdm_arrays(height_data->ssdm);
 		}
 	}
 




More information about the Bf-blender-cvs mailing list