browserutilities/feedsengine/FeedsServer/Common/src/LeakTracker.cpp
changeset 0 dd21522fd290
child 36 0ed94ceaa377
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/feedsengine/FeedsServer/Common/src/LeakTracker.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,181 @@
+/*
+* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  A class to help track memory leaks.
+*
+*/
+
+
+
+#include "LeakTracker.h"
+#include "Logger.h"
+
+// Globals
+#ifdef TRACK_LEAKS
+CLeakTracker*  gLeakTracker = NULL;
+
+// -----------------------------------------------------------------------------
+// CLeakTracker::NewL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CLeakTracker* CLeakTracker::NewL(const TDesC& aSource)
+    {
+    CLeakTracker* self = new (ELeave) CLeakTracker();
+
+    CleanupStack::PushL(self);
+    self->ConstructL(aSource);
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+        
+// -----------------------------------------------------------------------------
+// CLeakTracker::CLeakTracker
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CLeakTracker::CLeakTracker():
+        iValues(40)
+    {
+    }
+        
+
+// -----------------------------------------------------------------------------
+// CLeakTracker::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CLeakTracker::ConstructL(const TDesC& aSource)
+    {
+    //++pK : Added if condition checking for NULL
+    	if ( iSource != NULL )
+    	{
+    		iSource = aSource.AllocL();	
+    	}
+    }
+        
+
+// -----------------------------------------------------------------------------
+// CLeakTracker::~CLeakTracker
+// Deconstructor.
+// -----------------------------------------------------------------------------
+//
+CLeakTracker::~CLeakTracker()
+    {
+    TBool foundLeak = EFalse;
+
+	if( iSource != NULL )
+	{
+		// Report leaks.
+	    TPtrC  source(*iSource);
+	    
+	    if( iValues != NULL)
+	    {
+	    	for (TInt i = 0; i < iValues.Count(); i++)
+	        {
+	        if (iValues[i].value != 0)
+	            {
+	            FEED_LOG3(_L("Feeds"), _L("Feeds_Leaks.log"), 
+	                    EFileLoggingModeAppend, _L("%S: Leak[%d]: %d"), &source, 
+	                    iValues[i].valueId, iValues[i].value);
+
+	            foundLeak = ETrue;
+	            }
+	        }
+
+	    // Free the array.
+	    iValues.Close();
+
+	    }
+	    
+	    
+	    gLeakTracker = NULL;
+
+	    if (!foundLeak)
+	        {
+	        FEED_LOG1(_L("Feeds"), _L("Feeds_Leaks.log"), 
+	                EFileLoggingModeAppend, _L("%S; No leaks found!!!"), &source);
+	        }
+	        
+	    delete iSource;
+			
+	}
+    
+        
+    
+    }
+
+        
+// -----------------------------------------------------------------------------
+// CLeakTracker::Increment
+//
+// Increments the ref-count on the given class type
+// -----------------------------------------------------------------------------
+//
+void CLeakTracker::Increment(TInstType aType)
+    {
+    LeakTracker_Value  newValue;
+
+    if (gLeakTracker == NULL)
+        {
+        return;
+        }
+
+    // Find the value-id
+    for (TInt i = 0; i < iValues.Count(); i++)
+        {
+        if (iValues[i].valueId == aType)
+            {
+            iValues[i].value++;
+            return;
+            }
+        }
+    
+    // The type wasn't found so append a new entry.
+    newValue.valueId = aType;
+    newValue.value = 1;
+    
+    iValues.Append(newValue);
+    // Ignore errors.
+    }
+
+
+// -----------------------------------------------------------------------------
+// CLeakTracker::Decrement
+//
+// Decrements the ref-count on the given class type
+// -----------------------------------------------------------------------------
+//
+void CLeakTracker::Decrement(TInstType aType)
+    {
+    if (gLeakTracker == NULL)
+        {
+        return;
+        }
+
+    // Find the value-id
+    for (TInt i = 0; i < iValues.Count(); i++)
+        {
+        if (iValues[i].valueId == aType)
+            {
+            iValues[i].value--;
+            return;
+            }
+        }
+    }
+
+#endif