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
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-12-14 17:20:33 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-12-14 17:29:16 +0300
commite67f7e922cfe6742753944fa1bf4ace358b382a7 (patch)
tree8f3c3925532b1f8e8a7d7883ba3b3460e18e13f5 /source/blender/blenkernel/intern
parent1e18efa1df1ad999303143156e0742d97d4c86bb (diff)
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.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r--source/blender/blenkernel/intern/lamp.c2
-rw-r--r--source/blender/blenkernel/intern/library_remap.c6
-rw-r--r--source/blender/blenkernel/intern/linestyle.c2
-rw-r--r--source/blender/blenkernel/intern/material.c6
-rw-r--r--source/blender/blenkernel/intern/node.c20
-rw-r--r--source/blender/blenkernel/intern/scene.c2
-rw-r--r--source/blender/blenkernel/intern/texture.c2
-rw-r--r--source/blender/blenkernel/intern/world.c2
8 files changed, 26 insertions, 16 deletions
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;
}