diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2016-12-06 21:13:02 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2016-12-06 21:13:02 +0300 |
commit | 3c3c818d1bc569a833e7a864fe27e4bc36cf106c (patch) | |
tree | c038754301ed86ad41667ac849bdf8636aa253bc /source | |
parent | a2e81fa2e93bf2c32fa48fd10c71e82d9f7659d7 (diff) |
Fix all unfreed memory
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_collection.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_layer.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/collection.c | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/layer.c | 52 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 8 |
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; } |