[Bf-blender-cvs] [e67f7e922cf] blender2.8: Attempt to sanitize node tree deletion

Sergey Sharybin noreply at git.blender.org
Fri Dec 14 15:30:09 CET 2018


Commit: e67f7e922cfe6742753944fa1bf4ace358b382a7
Author: Sergey Sharybin
Date:   Fri Dec 14 15:20:33 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBe67f7e922cfe6742753944fa1bf4ace358b382a7

Attempt to sanitize node tree deletion

Make it explicit when freeing node tree which is owned by other
ID or when freeing node tree which is outside of a bmain.

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/lamp.c
M	source/blender/blenkernel/intern/library_remap.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/blenloader/intern/versioning_defaults.c
M	source/blender/gpu/intern/gpu_material.c

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 5f0635037c2..0368f5befd3 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -332,6 +332,8 @@ struct bNodeTree *ntreeAddTree(struct Main *bmain, const char *name, const char
 
 /* copy/free funcs, need to manage ID users */
 void              ntreeFreeTree(struct bNodeTree *ntree);
+/* Free tree which is owned byt another datablock. */
+void              ntreeFreeNestedTree(struct bNodeTree *ntree);
 void BKE_node_tree_copy_data(struct Main *bmain, struct bNodeTree *ntree_dst, const struct bNodeTree *ntree_src, const int flag);
 struct bNodeTree *ntreeCopyTree_ex(const struct bNodeTree *ntree, struct Main *bmain, const bool do_id_user);
 struct bNodeTree *ntreeCopyTree(struct Main *bmain, const struct bNodeTree *ntree);
@@ -343,6 +345,7 @@ void              ntreeUserDecrefID(struct bNodeTree *ntree);
 struct bNodeTree *ntreeFromID(const struct ID *id);
 
 void              ntreeMakeLocal(struct Main *bmain, struct bNodeTree *ntree, bool id_in_mainlist, const bool lib_local);
+void              ntreeFreeLocalTree(struct bNodeTree *ntree);
 struct bNode     *ntreeFindType(const struct bNodeTree *ntree, int type);
 bool              ntreeHasType(const struct bNodeTree *ntree, int type);
 bool              ntreeHasTree(const struct bNodeTree *ntree, const struct bNodeTree *lookup);
diff --git a/source/blender/blenkernel/intern/lamp.c b/source/blender/blenkernel/intern/lamp.c
index a6ec44f524c..ff79185d2b4 100644
--- a/source/blender/blenkernel/intern/lamp.c
+++ b/source/blender/blenkernel/intern/lamp.c
@@ -177,7 +177,7 @@ void BKE_lamp_free(Lamp *la)
 
 	/* is no lib link block, but lamp extension */
 	if (la->nodetree) {
-		ntreeFreeTree(la->nodetree);
+		ntreeFreeNestedTree(la->nodetree);
 		MEM_freeN(la->nodetree);
 		la->nodetree = NULL;
 	}
diff --git a/source/blender/blenkernel/intern/library_remap.c b/source/blender/blenkernel/intern/library_remap.c
index 70f3c6d6cf6..458d723c95a 100644
--- a/source/blender/blenkernel/intern/library_remap.c
+++ b/source/blender/blenkernel/intern/library_remap.c
@@ -679,19 +679,13 @@ void BKE_libblock_relink_to_newid(ID *id)
 
 void BKE_libblock_free_data(ID *id, const bool do_id_user)
 {
-	/* NOTE: We set pointers to NULL so subsequent call of this function doesn't
-	 * cause double-free.
-	 * This is mainly to prevent crazy behavior of ntreeFreeTree() which does
-	 * call BKE_libblock_free_data() for nodetrees outside of bmain. */
 	if (id->properties) {
 		IDP_FreeProperty_ex(id->properties, do_id_user);
 		MEM_freeN(id->properties);
-		id->properties = NULL;
 	}
 
 	if (id->override_static) {
 		BKE_override_static_free(&id->override_static);
-		id->override_static = NULL;
 	}
 
 	/* XXX TODO remove animdata handling from each type's freeing func, and do it here, like for copy! */
diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c
index fdf5ef5f0c1..31a261fdb4f 100644
--- a/source/blender/blenkernel/intern/linestyle.c
+++ b/source/blender/blenkernel/intern/linestyle.c
@@ -139,7 +139,7 @@ void BKE_linestyle_free(FreestyleLineStyle *linestyle)
 
 	/* is no lib link block, but linestyle extension */
 	if (linestyle->nodetree) {
-		ntreeFreeTree(linestyle->nodetree);
+		ntreeFreeNestedTree(linestyle->nodetree);
 		MEM_freeN(linestyle->nodetree);
 		linestyle->nodetree = NULL;
 	}
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 81c220045ba..30fc02e94de 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -99,7 +99,7 @@ void BKE_material_free(Material *ma)
 
 	/* is no lib link block, but material extension */
 	if (ma->nodetree) {
-		ntreeFreeTree(ma->nodetree);
+		ntreeFreeNestedTree(ma->nodetree);
 		MEM_freeN(ma->nodetree);
 		ma->nodetree = NULL;
 	}
@@ -1373,7 +1373,7 @@ void clear_matcopybuf(void)
 void free_matcopybuf(void)
 {
 	if (matcopybuf.nodetree) {
-		ntreeFreeTree(matcopybuf.nodetree);
+		ntreeFreeLocalTree(matcopybuf.nodetree);
 		MEM_freeN(matcopybuf.nodetree);
 		matcopybuf.nodetree = NULL;
 	}
@@ -1406,7 +1406,7 @@ void paste_matcopybuf(Main *bmain, Material *ma)
 	GPU_material_free(&ma->gpumaterial);
 
 	if (ma->nodetree) {
-		ntreeFreeTree(ma->nodetree);
+		ntreeFreeNestedTree(ma->nodetree);
 		MEM_freeN(ma->nodetree);
 	}
 
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 9b06b49a5d9..ea31ad08e61 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1870,8 +1870,24 @@ void ntreeFreeTree(bNodeTree *ntree)
 	if (ntree->duplilock)
 		BLI_mutex_free(ntree->duplilock);
 
-	/* if ntree is not part of library, free the libblock data explicitly */
-	if (ntree->id.tag & LIB_TAG_NO_MAIN) {
+	if (ntree->id.tag & LIB_TAG_LOCALIZED) {
+		BKE_libblock_free_data(&ntree->id, true);
+	}
+}
+
+void ntreeFreeNestedTree(bNodeTree *ntree)
+{
+	ntreeFreeTree(ntree);
+	BKE_libblock_free_data(&ntree->id, true);
+}
+
+void ntreeFreeLocalTree(bNodeTree *ntree)
+{
+	if (ntree->id.tag & LIB_TAG_LOCALIZED) {
+		ntreeFreeTree(ntree);
+	}
+	else {
+		ntreeFreeTree(ntree);
 		BKE_libblock_free_data(&ntree->id, true);
 	}
 }
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index e76b1776b25..a070bf97317 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -470,7 +470,7 @@ void BKE_scene_free_ex(Scene *sce, const bool do_id_user)
 
 	/* is no lib link block, but scene extension */
 	if (sce->nodetree) {
-		ntreeFreeTree(sce->nodetree);
+		ntreeFreeNestedTree(sce->nodetree);
 		MEM_freeN(sce->nodetree);
 		sce->nodetree = NULL;
 	}
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index cdcb51f8e72..3d180bd7856 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -205,7 +205,7 @@ void BKE_texture_free(Tex *tex)
 
 	/* is no lib link block, but texture extension */
 	if (tex->nodetree) {
-		ntreeFreeTree(tex->nodetree);
+		ntreeFreeNestedTree(tex->nodetree);
 		MEM_freeN(tex->nodetree);
 		tex->nodetree = NULL;
 	}
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index bab1b297637..319bc3532c2 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -68,7 +68,7 @@ void BKE_world_free(World *wrld)
 
 	/* is no lib link block, but world extension */
 	if (wrld->nodetree) {
-		ntreeFreeTree(wrld->nodetree);
+		ntreeFreeNestedTree(wrld->nodetree);
 		MEM_freeN(wrld->nodetree);
 		wrld->nodetree = NULL;
 	}
diff --git a/source/blender/blenloader/intern/versioning_defaults.c b/source/blender/blenloader/intern/versioning_defaults.c
index e7244f926ff..171e40deb24 100644
--- a/source/blender/blenloader/intern/versioning_defaults.c
+++ b/source/blender/blenloader/intern/versioning_defaults.c
@@ -246,7 +246,7 @@ void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template)
 
 			/* Don't enable compositing nodes. */
 			if (scene->nodetree) {
-				ntreeFreeTree(scene->nodetree);
+				ntreeFreeNestedTree(scene->nodetree);
 				MEM_freeN(scene->nodetree);
 				scene->nodetree = NULL;
 				scene->use_nodes = false;
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 746ba96abf7..e4a55943999 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -714,7 +714,7 @@ GPUMaterial *GPU_material_from_nodetree(
 
 	/* Only free after GPU_pass_shader_get where GPUUniformBuffer
 	 * read data from the local tree. */
-	ntreeFreeTree(localtree);
+	ntreeFreeLocalTree(localtree);
 	MEM_freeN(localtree);
 
 	/* note that even if building the shader fails in some way, we still keep



More information about the Bf-blender-cvs mailing list