diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-12-14 17:20:33 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-12-14 17:29:16 +0300 |
commit | e67f7e922cfe6742753944fa1bf4ace358b382a7 (patch) | |
tree | 8f3c3925532b1f8e8a7d7883ba3b3460e18e13f5 /source/blender | |
parent | 1e18efa1df1ad999303143156e0742d97d4c86bb (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')
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/lamp.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/library_remap.c | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/linestyle.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 20 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/texture.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/world.c | 2 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_defaults.c | 2 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_material.c | 2 |
11 files changed, 31 insertions, 18 deletions
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 |