[Bf-blender-cvs] [326255d] object_nodes: Fix a memleak of the return value user counter from mesh_ptr.
Lukas Tönne
noreply at git.blender.org
Wed Jan 13 11:03:10 CET 2016
Commit: 326255d080cae6030f76a9f3f4ad686c1ead6b40
Author: Lukas Tönne
Date: Wed Jan 13 10:56:31 2016 +0100
Branches: object_nodes
https://developer.blender.org/rB326255d080cae6030f76a9f3f4ad686c1ead6b40
Fix a memleak of the return value user counter from mesh_ptr.
The returned mesh_ptr result needs to be cleared to ensure the user
counter is also freed. To avoid deleting the mesh data as well a new
function 'reset' was added, which frees the user counter but only resets
the data pointer without freeing it.
===================================================================
M source/blender/blenvm/intern/bvm_api.cc
M source/blender/blenvm/util/bvm_util_data_ptr.h
===================================================================
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index ff37731..839bb67 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -1131,7 +1131,9 @@ struct DerivedMesh *BVM_eval_modifier(struct BVMEvalGlobals *globals,
_CTX(ctx)->eval_function(_GLOBALS(globals), _FUNC(fn), args, results);
- return result.get();
+ DerivedMesh *dm = result.get();
+ result.reset();
+ return dm;
}
/* ------------------------------------------------------------------------- */
diff --git a/source/blender/blenvm/util/bvm_util_data_ptr.h b/source/blender/blenvm/util/bvm_util_data_ptr.h
index 2644ad3..e87d4fd 100644
--- a/source/blender/blenvm/util/bvm_util_data_ptr.h
+++ b/source/blender/blenvm/util/bvm_util_data_ptr.h
@@ -72,7 +72,20 @@ struct node_data_ptr {
{
}
- element_type* get() const { return m_data; }
+ element_type* get() const
+ {
+ return m_data;
+ }
+
+ void reset()
+ {
+ m_data = 0;
+ if (m_refs) {
+ destroy_refs(m_refs);
+ m_refs = 0;
+ }
+ }
+
void set(element_type *data)
{
if (m_data != data) {
@@ -90,6 +103,10 @@ struct node_data_ptr {
assert(m_refs == 0);
if (use_count > 0)
m_refs = create_refs(use_count);
+ else if (m_refs) {
+ destroy_refs(m_refs);
+ m_refs = 0;
+ }
}
void decrement_use_count()
More information about the Bf-blender-cvs
mailing list