diff options
author | Daniel Stokes <kupomail@gmail.com> | 2013-06-25 01:11:13 +0400 |
---|---|---|
committer | Daniel Stokes <kupomail@gmail.com> | 2013-06-25 01:11:13 +0400 |
commit | 898b49f7530e860a9accc4bb5ad897d12c55ef02 (patch) | |
tree | 55b71624a3e8bd5d09aa8599bf4e8c52f785633d /source/blender/blenkernel/intern/node.c | |
parent | f8c37b083c50ac2c8dd697bcb44401b3a841a170 (diff) |
Making sure free_nodesystem only frees non-NULL data. This helps address some problems in the BGE with loading multiple blendfiles.
Diffstat (limited to 'source/blender/blenkernel/intern/node.c')
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 152d74f2ad6..ee8edfe32ae 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -3546,33 +3546,39 @@ void init_nodesystem(void) void free_nodesystem(void) { - NODE_TYPES_BEGIN(nt) - if (nt->ext.free) { - nt->ext.free(nt->ext.data); - } - NODE_TYPES_END - - NODE_SOCKET_TYPES_BEGIN(st) - if (st->ext_socket.free) - st->ext_socket.free(st->ext_socket.data); - if (st->ext_interface.free) - st->ext_interface.free(st->ext_interface.data); - NODE_SOCKET_TYPES_END - - NODE_TREE_TYPES_BEGIN(nt) - if (nt->ext.free) { - nt->ext.free(nt->ext.data); - } - NODE_TREE_TYPES_END - - BLI_ghash_free(nodetypes_hash, NULL, node_free_type); - nodetypes_hash = NULL; - - BLI_ghash_free(nodesockettypes_hash, NULL, node_free_socket_type); - nodesockettypes_hash = NULL; - - BLI_ghash_free(nodetreetypes_hash, NULL, ntree_free_type); - nodetreetypes_hash = NULL; + if (nodetypes_hash) { + NODE_TYPES_BEGIN(nt) + if (nt->ext.free) { + nt->ext.free(nt->ext.data); + } + NODE_TYPES_END + + BLI_ghash_free(nodetypes_hash, NULL, node_free_type); + nodetypes_hash = NULL; + } + + if (nodesockettypes_hash) { + NODE_SOCKET_TYPES_BEGIN(st) + if (st->ext_socket.free) + st->ext_socket.free(st->ext_socket.data); + if (st->ext_interface.free) + st->ext_interface.free(st->ext_interface.data); + NODE_SOCKET_TYPES_END + + BLI_ghash_free(nodesockettypes_hash, NULL, node_free_socket_type); + nodesockettypes_hash = NULL; + } + + if (nodetreetypes_hash) { + NODE_TREE_TYPES_BEGIN(nt) + if (nt->ext.free) { + nt->ext.free(nt->ext.data); + } + NODE_TREE_TYPES_END + + BLI_ghash_free(nodetreetypes_hash, NULL, ntree_free_type); + nodetreetypes_hash = NULL; + } } /* called from BKE_scene_unlink, when deleting a scene goes over all scenes |