[Bf-blender-cvs] [08530c7] object_nodes: Fix memleaks in refcounted data pointers on the bvm stack.

Lukas Tönne noreply at git.blender.org
Thu Dec 31 14:57:12 CET 2015


Commit: 08530c7eea4958dfc42f89ab818798acfad96fd7
Author: Lukas Tönne
Date:   Thu Dec 31 14:56:54 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB08530c7eea4958dfc42f89ab818798acfad96fd7

Fix memleaks in refcounted data pointers on the bvm stack.

===================================================================

M	source/blender/blenvm/intern/bvm_api.cc
M	source/blender/blenvm/util/bvm_util_typedesc.h

===================================================================

diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index f22dfdc..f60681d 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -1164,7 +1164,6 @@ void BVM_eval_dupli(struct BVMEvalGlobals *globals,
 			BKE_dupli_add_instance(duplicont, dupli.object, (float (*)[4])dupli.transform.data, dupli.index,
 			                       false, dupli.hide, dupli.recursive);
 		}
-		
-		delete duplis;
 	}
+	result.clear();
 }
diff --git a/source/blender/blenvm/util/bvm_util_typedesc.h b/source/blender/blenvm/util/bvm_util_typedesc.h
index e02706a..4640261 100644
--- a/source/blender/blenvm/util/bvm_util_typedesc.h
+++ b/source/blender/blenvm/util/bvm_util_typedesc.h
@@ -205,7 +205,14 @@ struct node_data_ptr {
 	}
 	
 	element_type* get() const { return m_data; }
-	void set(element_type *data) { m_data = data; }
+	void set(element_type *data)
+	{
+		if (m_data != data) {
+			if (m_data)
+				DestructorT::destroy(m_data);
+			m_data = data;
+		}
+	}
 	
 	element_type& operator * () const { return *m_data; }
 	element_type* operator -> () const { return m_data; }
@@ -222,17 +229,11 @@ struct node_data_ptr {
 		assert(m_refs != 0 && *m_refs > 0);
 		size_t count = --(*m_refs);
 		if (count == 0) {
-			if (m_data) {
-				DestructorT::destroy(m_data);
-				m_data = 0;
-			}
-			if (m_refs) {
-				destroy_refs(m_refs);
-			}
+			clear();
 		}
 	}
 	
-	void clear_use_count()
+	void clear()
 	{
 		if (m_data) {
 			DestructorT::destroy(m_data);
@@ -240,6 +241,7 @@ struct node_data_ptr {
 		}
 		if (m_refs) {
 			destroy_refs(m_refs);
+			m_refs = 0;
 		}
 	}
 	
@@ -315,6 +317,7 @@ typedef node_data_ptr<DupliList> duplis_ptr;
 inline void create_empty_mesh(mesh_ptr &p)
 {
 	DerivedMesh *dm = CDDM_new(0, 0, 0, 0, 0);
+	/* prevent the DM from getting freed */
 	dm->needsFree = 0;
 	p.set(dm);
 }
@@ -322,9 +325,9 @@ inline void create_empty_mesh(mesh_ptr &p)
 inline void destroy_empty_mesh(mesh_ptr &p)
 {
 	DerivedMesh *dm = p.get();
+	/* have to set this back so the DM actually gets freed */
 	dm->needsFree = 1;
-	dm->release(dm);
-	p.set(NULL);
+	p.clear();
 }




More information about the Bf-blender-cvs mailing list