[Bf-blender-cvs] [e734bef] free-refcount-ids: Free IDs: Nodes & Groups.
Bastien Montagne
noreply at git.blender.org
Thu Oct 1 17:44:25 CEST 2015
Commit: e734bef9d604346c5c55409a3603ca35f88644c1
Author: Bastien Montagne
Date: Thu Oct 1 17:13:16 2015 +0200
Branches: free-refcount-ids
https://developer.blender.org/rBe734bef9d604346c5c55409a3603ca35f88644c1
Free IDs: Nodes & Groups.
===================================================================
M source/blender/blenkernel/BKE_group.h
M source/blender/blenkernel/BKE_node.h
M source/blender/blenkernel/intern/group.c
M source/blender/blenkernel/intern/lamp.c
M source/blender/blenkernel/intern/library.c
M source/blender/blenkernel/intern/linestyle.c
M source/blender/blenkernel/intern/material.c
M source/blender/blenkernel/intern/node.c
M source/blender/blenkernel/intern/scene.c
M source/blender/blenkernel/intern/texture.c
M source/blender/blenkernel/intern/world.c
M source/blender/editors/space_node/node_group.c
M source/blender/nodes/shader/node_shader_tree.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_group.h b/source/blender/blenkernel/BKE_group.h
index d856e90..d27bdd3 100644
--- a/source/blender/blenkernel/BKE_group.h
+++ b/source/blender/blenkernel/BKE_group.h
@@ -40,7 +40,7 @@ struct Main;
struct Object;
struct Scene;
-void BKE_group_free(struct Group *group);
+void BKE_group_free(struct Group *group, const bool do_id_user);
void BKE_group_unlink(struct Group *group);
struct Group *BKE_group_add(struct Main *bmain, const char *name);
struct Group *BKE_group_copy(struct Group *group);
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index b97bf20..78a2396 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -340,8 +340,7 @@ void ntreeSetTypes(const struct bContext *C, struct bNodeTree *ntree);
struct bNodeTree *ntreeAddTree(struct Main *bmain, const char *name, const char *idname);
/* copy/free funcs, need to manage ID users */
-void ntreeFreeTree_ex(struct bNodeTree *ntree, const bool do_id_user);
-void ntreeFreeTree(struct bNodeTree *ntree);
+void ntreeFreeTree(struct bNodeTree *ntree, const bool do_id_user);
struct bNodeTree *ntreeCopyTree_ex(struct bNodeTree *ntree, struct Main *bmain, const bool do_id_user);
struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
void ntreeSwitchID_ex(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to, const bool do_id_user);
diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c
index 3f68339..2ce071c 100644
--- a/source/blender/blenkernel/intern/group.c
+++ b/source/blender/blenkernel/intern/group.c
@@ -60,17 +60,17 @@ static void free_group_object(GroupObject *go)
MEM_freeN(go);
}
-
-void BKE_group_free(Group *group)
+/* Note: technically, grouobjects are ID users (without refcount), but for now we can ignore those. */
+void BKE_group_free(Group *group, const bool UNUSED(do_id_user))
{
/* don't free group itself */
GroupObject *go;
- BKE_previewimg_free(&group->preview);
-
while ((go = BLI_pophead(&group->gobject))) {
free_group_object(go);
}
+
+ BKE_previewimg_free(&group->preview);
}
void BKE_group_unlink(Group *group)
@@ -132,7 +132,8 @@ void BKE_group_unlink(Group *group)
}
/* group stays in library, but no members */
- BKE_group_free(group);
+ /* XXX This is suspicious, means we keep a dangling, empty group? Also, does not take into account fakeuser? */
+ BKE_group_free(group, false);
group->id.us = 0;
}
diff --git a/source/blender/blenkernel/intern/lamp.c b/source/blender/blenkernel/intern/lamp.c
index 309ba46..b4a47c1 100644
--- a/source/blender/blenkernel/intern/lamp.c
+++ b/source/blender/blenkernel/intern/lamp.c
@@ -255,7 +255,7 @@ void BKE_lamp_free(Lamp *la, const bool do_id_user)
/* is no lib link block, but lamp extension */
if (la->nodetree) {
- ntreeFreeTree_ex(la->nodetree, do_id_user);
+ ntreeFreeTree(la->nodetree, do_id_user);
MEM_freeN(la->nodetree);
la->nodetree = NULL;
}
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index c472332..43fe5f4 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1006,7 +1006,7 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, bool do_id_user)
BKE_sound_free((bSound *)id, do_id_user);
break;
case ID_GR:
- BKE_group_free((Group *)id);
+ BKE_group_free((Group *)id, do_id_user);
break;
case ID_AR:
BKE_armature_free((bArmature *)id, do_id_user);
@@ -1015,7 +1015,7 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, bool do_id_user)
BKE_action_free((bAction *)id, do_id_user);
break;
case ID_NT:
- ntreeFreeTree_ex((bNodeTree *)id, do_id_user); /* TODO! */
+ ntreeFreeTree((bNodeTree *)id, do_id_user);
break;
case ID_BR:
BKE_brush_free((Brush *)id, do_id_user);
diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c
index 7e6e532..3f97d23 100644
--- a/source/blender/blenkernel/intern/linestyle.c
+++ b/source/blender/blenkernel/intern/linestyle.c
@@ -164,7 +164,7 @@ void BKE_linestyle_free(FreestyleLineStyle *linestyle, const bool do_id_user)
/* is no lib link block, but linestyle extension */
if (linestyle->nodetree) {
- ntreeFreeTree(linestyle->nodetree);
+ ntreeFreeTree(linestyle->nodetree, true); /* XXX Or do_id_user? */
MEM_freeN(linestyle->nodetree);
linestyle->nodetree = NULL;
}
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 5522f8a..27d4761 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -129,7 +129,7 @@ void BKE_material_free(Material *ma, const bool do_id_user)
/* is no lib link block, but material extension */
if (ma->nodetree) {
- ntreeFreeTree_ex(ma->nodetree, do_id_user);
+ ntreeFreeTree(ma->nodetree, do_id_user);
MEM_freeN(ma->nodetree);
ma->nodetree = NULL;
}
@@ -1777,7 +1777,7 @@ void free_matcopybuf(void)
matcopybuf.ramp_spec = NULL;
if (matcopybuf.nodetree) {
- ntreeFreeTree_ex(matcopybuf.nodetree, false);
+ ntreeFreeTree(matcopybuf.nodetree, false);
MEM_freeN(matcopybuf.nodetree);
matcopybuf.nodetree = NULL;
}
@@ -1827,7 +1827,7 @@ void paste_matcopybuf(Material *ma)
}
if (ma->nodetree) {
- ntreeFreeTree(ma->nodetree);
+ ntreeFreeTree(ma->nodetree, true); /* XXX Or do_id_user? */
MEM_freeN(ma->nodetree);
}
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index c656931..c8a5322 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1775,14 +1775,14 @@ static void free_localized_node_groups(bNodeTree *ntree)
for (node = ntree->nodes.first; node; node = node->next) {
if (node->type == NODE_GROUP && node->id) {
bNodeTree *ngroup = (bNodeTree *)node->id;
- ntreeFreeTree_ex(ngroup, false);
+ ntreeFreeTree(ngroup, false);
MEM_freeN(ngroup);
}
}
}
/* do not free ntree itself here, BKE_libblock_free calls this function too */
-void ntreeFreeTree_ex(bNodeTree *ntree, const bool do_id_user)
+void ntreeFreeTree(bNodeTree *ntree, const bool do_id_user)
{
bNodeTree *tntree;
bNode *node, *next;
@@ -1867,11 +1867,6 @@ void ntreeFreeTree_ex(bNodeTree *ntree, const bool do_id_user)
BKE_libblock_free_data(G.main, &ntree->id);
}
}
-/* same as ntreeFreeTree_ex but always manage users */
-void ntreeFreeTree(bNodeTree *ntree)
-{
- ntreeFreeTree_ex(ntree, true);
-}
void ntreeFreeCache(bNodeTree *ntree)
{
@@ -2145,7 +2140,7 @@ void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree)
if (ntree->typeinfo->local_merge)
ntree->typeinfo->local_merge(localtree, ntree);
- ntreeFreeTree_ex(localtree, false);
+ ntreeFreeTree(localtree, false);
MEM_freeN(localtree);
}
}
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index d80f34e..1654858 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -424,9 +424,10 @@ void BKE_scene_free(Scene *sce, const bool do_id_user)
BKE_animdata_free((ID *)sce);
BKE_keyingsets_free(&sce->keyingsets);
- /* is no lib link block, but material extension */
+ /* is no lib link block, but scene extension */
if (sce->nodetree) {
- ntreeFreeTree_ex(sce->nodetree, do_id_user);
+ ntreeFreeTree(sce->nodetree, do_id_user);
+ MEM_freeN(sce->nodetree);
sce->nodetree = NULL;
}
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index 5856827..58e578f 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -585,9 +585,9 @@ void BKE_texture_free(Tex *tex, const bool do_id_user)
BKE_animdata_free((ID *)tex);
- /* is no lib link block, but material extension */
+ /* is no lib link block, but texture extension */
if (tex->nodetree) {
- ntreeFreeTree_ex(tex->nodetree, do_id_user);
+ ntreeFreeTree(tex->nodetree, do_id_user);
MEM_freeN(tex->nodetree);
tex->nodetree = NULL;
}
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index a9e852d..6395ee6 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -93,8 +93,9 @@ void BKE_world_free(World *wrld, const bool do_id_user)
/* is no lib link block, but world extension */
if (wrld->nodetree) {
- ntreeFreeTree_ex(wrld->nodetree, do_id_user);
- MEM_SAFE_FREE(wrld->nodetree);
+ ntreeFreeTree(wrld->nodetree, do_id_user);
+ MEM_freeN(wrld->nodetree);
+ wrld->nodetree = NULL;
}
GPU_material_free(&wrld->gpumaterial);
diff --git a/source/blender/editors/space_node/node_group.c b/source/blender/editors/space_node/node_group.c
index b57f95d..cdbdf48 100644
--- a/source/blender/editors/space_node/node_group.c
+++ b/source/blender/editors/space_node/node_group.c
@@ -623,7 +623,7 @@ static bool node_group_make_test_selected(bNodeTree *ntree, bNode *gnode, const
}
/* free local pseudo node tree again */
- ntreeFreeTree(ngroup);
+ ntreeFreeTree(ngroup, true);
MEM_freeN(ngroup);
if (!ok)
return false;
diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c
index c4ec55c..c3dbe2b 100644
--- a/source/blender/nodes/shader/node_shader_tree.c
+++ b/source/blender/nodes/shader/node_shader_tree.c
@@ -209,7 +209,7 @@ void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat, short compatibili
ntreeExecGPUNodes(exec, mat, 1, compatibility);
ntreeShaderEndExecTree(exec);
- ntreeFreeTree_ex(localtree, false);
+ ntreeFreeTree(localtree, false);
MEM_freeN(localtree);
}
More information about the Bf-blender-cvs
mailing list