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:
authorDaniel Stokes <kupomail@gmail.com>2013-06-25 01:11:13 +0400
committerDaniel Stokes <kupomail@gmail.com>2013-06-25 01:11:13 +0400
commit898b49f7530e860a9accc4bb5ad897d12c55ef02 (patch)
tree55b71624a3e8bd5d09aa8599bf4e8c52f785633d /source/blender
parentf8c37b083c50ac2c8dd697bcb44401b3a841a170 (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')
-rw-r--r--source/blender/blenkernel/intern/node.c60
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