[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