diff -r 000000000000 -r dd21522fd290 browserutilities/feedsengine/FeedsServer/Common/src/LeakTracker.cpp --- /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