[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13935] trunk/blender/source/gameengine: Various mem leaks related to CValue reference count fixed

Benoit Bolsee benoit.bolsee at online.be
Sat Mar 1 20:46:50 CET 2008


Revision: 13935
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13935
Author:   ben2610
Date:     2008-03-01 20:46:50 +0100 (Sat, 01 Mar 2008)

Log Message:
-----------
Various mem leaks related to CValue reference count fixed

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
    trunk/blender/source/gameengine/Converter/KX_ConvertControllers.cpp
    trunk/blender/source/gameengine/Converter/KX_ConvertProperties.cpp
    trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
    trunk/blender/source/gameengine/Expressions/Expression.cpp
    trunk/blender/source/gameengine/Expressions/Value.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_LogicManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.h

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-03-01 19:29:01 UTC (rev 13934)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-03-01 19:46:50 UTC (rev 13935)
@@ -1514,7 +1514,8 @@
 		default:
 			break;
 	}
-
+	delete shapeprops;
+	delete smmaterial;
 }
 
 
@@ -1599,7 +1600,8 @@
 		KX_Camera* gamecamera = gamecamera_from_bcamera(static_cast<Camera*>(ob->data), kxscene, converter);
 		gameobj = gamecamera;
 		
-		gamecamera->AddRef();
+		//don't add a reference: the camera list in kxscene->m_cameras is not released at the end
+		//gamecamera->AddRef();
 		kxscene->AddCamera(gamecamera);
 		
 		break;
@@ -1845,6 +1847,7 @@
 	vector<parentChildLink> vec_parent_child;
 	
 	CListValue* objectlist = kxscene->GetObjectList();
+	CListValue* inactivelist = kxscene->GetInactiveList();
 	CListValue* parentlist = kxscene->GetRootParentList();
 	
 	SCA_LogicManager* logicmgr = kxscene->GetLogicManager();
@@ -1852,7 +1855,7 @@
 	
 	CListValue* logicbrick_conversionlist = new CListValue();
 	
-	SG_TreeFactory tf;
+	//SG_TreeFactory tf;
 	
 	// Convert actions to actionmap
 	bAction *curAct;
@@ -1990,19 +1993,35 @@
 			if (isInActiveLayer)
 			{
 				objectlist->Add(gameobj->AddRef());
-				tf.Add(gameobj->GetSGNode());
+				//tf.Add(gameobj->GetSGNode());
 				
 				gameobj->NodeUpdateGS(0,true);
 				gameobj->Bucketize();
 				
 			}
+			else
+			{
+				//we must store this object otherwise it will be deleted 
+				//at the end of this function if it is not a root object
+				inactivelist->Add(gameobj->AddRef());
+			}
 			if (converter->addInitFromFrame){
 				gameobj->NodeSetLocalPosition(posPrev);
 				gameobj->NodeSetLocalOrientation(angor);
 			}
 						
 		}
-			
+		/* Note about memory leak issues:
+		   When a CValue derived class is created, m_refcount is initialized to 1
+		   so the class must be released after being used to make sure that it won't 
+		   hang in memory. If the object needs to be stored for a long time, 
+		   use AddRef() so that this Release() does not free the object.
+		   Make sure that for any AddRef() there is a Release()!!!! 
+		   Do the same for any object derived from CValue, CExpression and NG_NetworkMessage
+		 */
+		if (gameobj)
+			gameobj->Release();
+
 		base = base->next;
 	}
 

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp	2008-03-01 19:29:01 UTC (rev 13934)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp	2008-03-01 19:46:50 UTC (rev 13935)
@@ -934,6 +934,8 @@
 			gameobj->AddActuator(baseact);
 			
 			converter->RegisterGameActuator(baseact, bact);
+			// done with baseact, release it
+			baseact->Release();
 		}
 		
 		bact = bact->next;

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertControllers.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertControllers.cpp	2008-03-01 19:29:01 UTC (rev 13934)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertControllers.cpp	2008-03-01 19:46:50 UTC (rev 13935)
@@ -174,6 +174,8 @@
 			gameobj->AddController(gamecontroller);
 			
 			converter->RegisterGameController(gamecontroller, bcontr);
+			//done with gamecontroller
+			gamecontroller->Release();
 		}
 		
 		bcontr = bcontr->next;

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertProperties.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertProperties.cpp	2008-03-01 19:29:01 UTC (rev 13934)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertProperties.cpp	2008-03-01 19:46:50 UTC (rev 13935)
@@ -105,8 +105,9 @@
 			// set a subproperty called 'timer' so that 
 			// we can register the replica of this property 
 			// at the time a game object is replicated (AddObjectActuator triggers this)
-
-			timeval->SetProperty("timer",new CBoolValue(true));
+			CValue *bval = new CBoolValue(true);
+			timeval->SetProperty("timer",bval);
+			bval->Release();
 			if (isInActiveLayer)
 			{
 				timemgr->AddTimeProperty(timeval);
@@ -128,6 +129,8 @@
 			{
 				scene->AddDebugProperty(gameobj,STR_String(prop->name));
 			}
+			// done with propval, release it
+			propval->Release();
 		}
 
 		prop = prop->next;

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp	2008-03-01 19:29:01 UTC (rev 13934)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp	2008-03-01 19:46:50 UTC (rev 13935)
@@ -733,6 +733,8 @@
 					logicmgr->RegisterToSensor(gamecont,gamesensor);
 				}
 			}
+			// done with gamesensor
+			gamesensor->Release();
 			
 		}
 		sens=sens->next;

Modified: trunk/blender/source/gameengine/Expressions/Expression.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/Expression.cpp	2008-03-01 19:29:01 UTC (rev 13934)
+++ trunk/blender/source/gameengine/Expressions/Expression.cpp	2008-03-01 19:46:50 UTC (rev 13935)
@@ -22,7 +22,9 @@
 //////////////////////////////////////////////////////////////////////
 // Construction/Destruction
 //////////////////////////////////////////////////////////////////////
-
+#ifdef _DEBUG
+//int gRefCountExpr;
+#endif
 CExpression::CExpression()// : m_cached_calculate(NULL)
 {
 	m_refcount = 1;

Modified: trunk/blender/source/gameengine/Expressions/Value.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/Value.cpp	2008-03-01 19:29:01 UTC (rev 13934)
+++ trunk/blender/source/gameengine/Expressions/Value.cpp	2008-03-01 19:46:50 UTC (rev 13935)
@@ -169,8 +169,29 @@
 	return pyname;
 }
 
+/*#define CVALUE_DEBUG*/
+#ifdef CVALUE_DEBUG
+int gRefCount;
+struct SmartCValueRef 
+{
+	CValue *m_ref;
+	int m_count;
+	SmartCValueRef(CValue *ref)
+	{
+		m_ref = ref;
+		m_count = gRefCount++;
+	}
+};
 
+#include <vector>
 
+std::vector<SmartCValueRef> gRefList;
+#endif
+
+#ifdef _DEBUG
+//int gRefCountValue;
+#endif
+
 CValue::CValue(PyTypeObject *T)
 		: PyObjectPlus(T),
 #else
@@ -186,6 +207,12 @@
 */
 {
 	//debug(gRefCountValue++)	// debugging
+#ifdef _DEBUG
+	//gRefCountValue++;
+#ifdef CVALUE_DEBUG
+	gRefList.push_back(SmartCValueRef(this));
+#endif
+#endif
 }
 
 
@@ -199,6 +226,18 @@
 	ClearProperties();
 
 	assertd (m_refcount==0);
+#ifdef CVALUE_DEBUG
+	std::vector<SmartCValueRef>::iterator it;
+	for (it=gRefList.begin(); it!=gRefList.end(); it++)
+	{
+		if (it->m_ref == this)
+		{
+			*it = gRefList.back();
+			gRefList.pop_back();
+			break;
+		}
+	}
+#endif
 }
 
 
@@ -293,7 +332,7 @@
 	}
 	
 	// Add property at end of array
-	(*m_pNamedPropertyArray)[name] = ioProperty;//->Add(ioProperty);
+	(*m_pNamedPropertyArray)[name] = ioProperty->AddRef();//->Add(ioProperty);
 }
 
 
@@ -356,10 +395,13 @@
 	if (m_pNamedPropertyArray == NULL)
 		return false;
 
-	// Scan all properties, as soon as we find one with <inName> -> Remove it
-//  	CValue* val = (*m_pNamedPropertyArray)[inName];
-	if (m_pNamedPropertyArray->erase(inName)) return true;
-	
+	CValue* val = GetProperty(inName);
+	if (NULL != val) 
+	{
+		val->Release();
+		m_pNamedPropertyArray->erase(inName);
+		return true;
+	}
 	return false;
 }
 
@@ -379,7 +421,7 @@
 	!(it == m_pNamedPropertyArray->end());it++)
 	{
 		CValue* tmpval = (*it).second;
-		STR_String name = (*it).first;
+		//STR_String name = (*it).first;
 		tmpval->Release();
 	}
 
@@ -469,8 +511,9 @@
 		for ( std::map<STR_String,CValue*>::iterator it = m_pNamedPropertyArray->begin();
 		!(it == m_pNamedPropertyArray->end());it++)
 		{
-			
-			replica->SetProperty((*it).first,(*it).second->GetReplica());
+			CValue *val = (*it).second->GetReplica();
+			replica->SetProperty((*it).first,val);
+			val->Release();
 		}
 	}
 
@@ -489,10 +532,6 @@
 }
 
 
-
-
-
-
 /*---------------------------------------------------------------------------------------------------------------------
 	Reference Counting
 ---------------------------------------------------------------------------------------------------------------------*/
@@ -504,6 +543,9 @@
 	// Increase global reference count, used to see at the end of the program
 	// if all CValue-derived classes have been dereferenced to 0
 	//debug(gRefCountValue++);
+#ifdef _DEBUG
+	//gRefCountValue++;
+#endif
 	m_refcount++; 
 	return this;
 }
@@ -518,7 +560,9 @@
 	// Decrease global reference count, used to see at the end of the program
 	// if all CValue-derived classes have been dereferenced to 0
 	//debug(gRefCountValue--);
-
+#ifdef _DEBUG
+	//gRefCountValue--;
+#endif
 	// Decrease local reference count, if it reaches 0 the object should be freed
 	if (--m_refcount > 0)
 	{
@@ -546,6 +590,9 @@
 	m_refcount--;
 
 	//debug(gRefCountValue--);
+#ifdef _DEBUG
+	//gRefCountValue--;
+#endif
 	m_ValFlags.RefCountDisabled=true;
 }
 
@@ -590,11 +637,14 @@
 	} else
 	{
 		result = GetProperty(identifiername);
+		if (result)
+			return result->AddRef();
 	}
-	if (result)
-		return result->AddRef();
-	// warning here !!!
-	result = new CErrorValue(identifiername+" not found");
+	if (!result)
+	{
+		// warning here !!!
+		result = new CErrorValue(identifiername+" not found");
+	}
 	return result;
 }
 
@@ -717,7 +767,7 @@
 			oldprop->SetValue(vallie);
 		} else
 		{
-			SetProperty(attr,vallie->AddRef());
+			SetProperty(attr,vallie);
 		}
 		vallie->Release();
 	}

Modified: trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp	2008-03-01 19:29:01 UTC (rev 13934)
+++ trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp	2008-03-01 19:46:50 UTC (rev 13935)
@@ -101,6 +101,7 @@
 
 void SCA_IObject::AddSensor(SCA_ISensor* act)
 {
+	act->AddRef();
 	m_sensors.push_back(act);
 }
 
@@ -108,6 +109,7 @@
 
 void SCA_IObject::AddController(SCA_IController* act)
 {
+	act->AddRef();
 	m_controllers.push_back(act);
 }
 
@@ -115,6 +117,7 @@
 
 void SCA_IObject::AddActuator(SCA_IActuator* act)
 {
+	act->AddRef();
 	m_actuators.push_back(act);
 }
 

Modified: trunk/blender/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list