[Bf-blender-cvs] [3c3c818] render-layers: Fix all unfreed memory

Dalai Felinto noreply at git.blender.org
Tue Dec 6 19:13:07 CET 2016


Commit: 3c3c818d1bc569a833e7a864fe27e4bc36cf106c
Author: Dalai Felinto
Date:   Tue Dec 6 19:13:02 2016 +0100
Branches: render-layers
https://developer.blender.org/rB3c3c818d1bc569a833e7a864fe27e4bc36cf106c

Fix all unfreed memory

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

M	source/blender/blenkernel/BKE_collection.h
M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/collection.c
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenkernel/intern/scene.c

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

diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h
index 41e1b69..a839824 100644
--- a/source/blender/blenkernel/BKE_collection.h
+++ b/source/blender/blenkernel/BKE_collection.h
@@ -38,6 +38,7 @@ struct Scene;
 struct SceneCollection *BKE_collection_add(struct Scene *scene, struct SceneCollection *sc_parent, const char *name);
 bool BKE_collection_remove(struct Scene *scene, struct SceneCollection *sc);
 struct SceneCollection *BKE_collection_master(struct Scene *scene);
+void BKE_collection_master_free(struct Scene *scene);
 void BKE_collection_object_add(struct Scene *scene, struct SceneCollection *sc, struct Object *object);
 void BKE_collection_object_remove(struct Scene *scene, struct SceneCollection *sc, struct Object *object);
 
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index c505a4c..26df4ef 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -47,6 +47,8 @@ struct SceneLayer *BKE_scene_layer_add(struct Scene *scene, const char *name);
 
 bool BKE_scene_layer_remove(struct Main *bmain, struct Scene *scene, struct SceneLayer *sl);
 
+void BKE_scene_layer_free(struct SceneLayer *sl);
+
 void BKE_scene_layer_engine_set(struct SceneLayer *sl, const char *engine);
 
 struct ObjectBase *BKE_scene_layer_base_find(struct SceneLayer *sl, struct Object *ob);
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 0ad82af..ed9aef2 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -62,10 +62,12 @@ static void collection_free(SceneCollection *sc)
 	for (LinkData *link = sc->objects.first; link; link = link->next) {
 		id_us_min(link->data);
 	}
+	BLI_freelistN(&sc->objects);
 
 	for (LinkData *link = sc->filter_objects.first; link; link = link->next) {
 		id_us_min(link->data);
 	}
+	BLI_freelistN(&sc->filter_objects);
 
 	for (SceneCollection *nsc = sc->scene_collections.first; nsc; nsc = nsc->next) {
 		collection_free(nsc);
@@ -160,6 +162,14 @@ SceneCollection *BKE_collection_master(Scene *scene)
 }
 
 /*
+ * Free (or release) any data used by the master collection (does not free the master collection itself).
+ * Used only to clear the entire scene data since it's not doing re-syncing of the LayerCollection tree
+ */
+void BKE_collection_master_free(Scene *scene){
+	collection_free(BKE_collection_master(scene));
+}
+
+/*
  * Add object to collection
  */
 void BKE_collection_object_add(struct Scene *UNUSED(scene), struct SceneCollection *sc, struct Object *ob)
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 309c969..b34f6da 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -45,6 +45,7 @@
 
 /* prototype */
 LayerCollection *layer_collection_add(SceneLayer *sl, ListBase *lb, SceneCollection *sc);
+void layer_collection_free(SceneLayer *sl, LayerCollection *lc);
 
 /* RenderLayer */
 
@@ -82,11 +83,7 @@ bool BKE_scene_layer_remove(Main *bmain, Scene *scene, SceneLayer *sl)
 	}
 
 	BLI_remlink(&scene->render_layers, sl);
-
-	BLI_freelistN(&sl->object_bases);
-	//layer_collections_free(rl, &rl->collection_bases);
-	BLI_freelistN(&sl->layer_collections);
-
+	BKE_scene_layer_free(sl);
 	MEM_freeN(sl);
 
 	/* TODO WORKSPACE: set active_layer to 0 */
@@ -109,6 +106,20 @@ bool BKE_scene_layer_remove(Main *bmain, Scene *scene, SceneLayer *sl)
 }
 
 /*
+ * Free (or release) any data used by this SceneLayer (does not free the SceneLayer itself).
+ */
+void BKE_scene_layer_free(SceneLayer *sl)
+{
+	sl->basact = NULL;
+	BLI_freelistN(&sl->object_bases);
+
+	for (LayerCollection *lc = sl->layer_collections.first; lc; lc = lc->next) {
+		layer_collection_free(NULL, lc);
+	}
+	BLI_freelistN(&sl->layer_collections);
+}
+
+/*
  * Set the render engine of a renderlayer
  */
 void BKE_scene_layer_engine_set(SceneLayer *sl, const char *engine)
@@ -148,21 +159,38 @@ static ObjectBase *object_base_add(SceneLayer *sl, Object *ob)
 }
 
 /* LayerCollection */
-/*
- * Free LayerCollection from SceneLayer
+
+/* When freeing the entire SceneLayer at once we don't bother with unref
+ * otherwise SceneLayer is passed to keep the syncing of the LayerCollection tree
  */
-void BKE_layer_collection_free(SceneLayer *sl, LayerCollection *lc)
+void layer_collection_free(SceneLayer *sl, LayerCollection *lc)
 {
-	for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) {
-		for (LinkData *link = nlc->object_bases.first; link; link = link->next) {
+	if (sl) {
+		for (LinkData *link = lc->object_bases.first; link; link = link->next) {
 			scene_layer_object_base_unref(sl, link->data);
 		}
+	}
 
-		BLI_freelistN(&nlc->object_bases);
-		BKE_layer_collection_free(sl, nlc);
+	BLI_freelistN(&lc->object_bases);
+	BLI_freelistN(&lc->overrides);
+
+	for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) {
+		layer_collection_free(sl, nlc);
 	}
+	BLI_freelistN(&lc->layer_collections);
+}
+
+/*
+ * Free (or release) LayerCollection from SceneLayer
+ * (does not free the LayerCollection itself).
+ */
+void BKE_layer_collection_free(SceneLayer *sl, LayerCollection *lc)
+{
+	layer_collection_free(sl, lc);
 }
 
+/* LayerCollection */
+
 /* Recursively get the collection for a given index */
 static LayerCollection *collection_from_index(ListBase *lb, const int number, int *i)
 {
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index ed0e543..c7fe30b 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -66,6 +66,7 @@
 #include "BKE_action.h"
 #include "BKE_armature.h"
 #include "BKE_cachefile.h"
+#include "BKE_collection.h"
 #include "BKE_colortools.h"
 #include "BKE_depsgraph.h"
 #include "BKE_editmesh.h"
@@ -77,6 +78,7 @@
 #include "BKE_icons.h"
 #include "BKE_idprop.h"
 #include "BKE_image.h"
+#include "BKE_layer.h"
 #include "BKE_library.h"
 #include "BKE_linestyle.h"
 #include "BKE_main.h"
@@ -463,7 +465,13 @@ void BKE_scene_free(Scene *sce)
 	BKE_previewimg_free(&sce->preview);
 	curvemapping_free_data(&sce->r.mblur_shutter_curve);
 
+	for (SceneLayer *sl = sce->render_layers.first; sl; sl = sl->next) {
+		BKE_scene_layer_free(sl);
+	}
+	BLI_freelistN(&sce->render_layers);
+
 	/* Master Collection */
+	BKE_collection_master_free(sce);
 	MEM_freeN(sce->collection);
 	sce->collection = NULL;
 }




More information about the Bf-blender-cvs mailing list