Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorDalai Felinto <dfelinto@gmail.com>2016-12-06 21:13:02 +0300
committerDalai Felinto <dfelinto@gmail.com>2016-12-06 21:13:02 +0300
commit3c3c818d1bc569a833e7a864fe27e4bc36cf106c (patch)
treec038754301ed86ad41667ac849bdf8636aa253bc /source
parenta2e81fa2e93bf2c32fa48fd10c71e82d9f7659d7 (diff)
Fix all unfreed memory
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_collection.h1
-rw-r--r--source/blender/blenkernel/BKE_layer.h2
-rw-r--r--source/blender/blenkernel/intern/collection.c10
-rw-r--r--source/blender/blenkernel/intern/layer.c52
-rw-r--r--source/blender/blenkernel/intern/scene.c8
5 files changed, 61 insertions, 12 deletions
diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h
index 41e1b69d1bf..a839824d229 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 c505a4c11b8..26df4ef466b 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 0ad82af62fb..ed9aef21dd6 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 309c9694c4b..b34f6dac13c 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 ed0e543ee48..c7fe30b246d 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;
}