--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/perfsrv/memspy/Engine/Source/Helpers/MemSpyEngineHelperKernelContainers.cpp Mon Sep 06 15:00:47 2010 +0300
@@ -0,0 +1,542 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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:
+*
+*/
+
+#include<memspy/engine/memspyenginehelperkernelcontainers.h>
+
+// User includes
+#include <memspy/engine/memspyengine.h>
+#include <memspy/engine/memspyengineutils.h>
+#include <memspy/engine/memspyengineoutputsink.h>
+#include <memspy/engine/memspyengineobjectthread.h>
+#include <memspy/engine/memspyengineobjectprocess.h>
+#include <memspy/engine/memspyengineobjectcontainer.h>
+
+// Driver includes
+#include <memspy/driver/memspydriverclient.h>
+#include <memspy/driver/memspydriverconstants.h>
+#include <memspy/driver/memspydriverenumerationsshared.h>
+
+// Constants
+const TInt KMaxGenericHandleCount = 1024 * 2;
+_LIT( KMemSpyMarkerKernelContainer, "<%SMEMSPY_KERNEL_CONTAINER_%02d>" );
+_LIT( KMemSpyMarkerKernelContainersAll, "<%SMEMSPY_KERNEL_CONTAINERS>" );
+
+
+
+CMemSpyEngineHelperKernelContainers::CMemSpyEngineHelperKernelContainers( CMemSpyEngine& aEngine )
+: iEngine( aEngine )
+ {
+ }
+
+
+CMemSpyEngineHelperKernelContainers::~CMemSpyEngineHelperKernelContainers()
+ {
+ }
+
+
+void CMemSpyEngineHelperKernelContainers::ConstructL()
+ {
+ }
+
+
+CMemSpyEngineHelperKernelContainers* CMemSpyEngineHelperKernelContainers::NewL( CMemSpyEngine& aEngine )
+ {
+ CMemSpyEngineHelperKernelContainers* self = new(ELeave) CMemSpyEngineHelperKernelContainers( aEngine );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+EXPORT_C CMemSpyEngineGenericKernelObjectList* CMemSpyEngineHelperKernelContainers::ObjectsForSpecificContainerL( TMemSpyDriverContainerType aForContainer )
+ {
+ CMemSpyEngineGenericKernelObjectList* list = CMemSpyEngineGenericKernelObjectList::NewLC( aForContainer, iEngine );
+ AddObjectsFromContainerL( *list, aForContainer );
+ CleanupStack::Pop( list );
+ return list;
+ }
+
+
+EXPORT_C CMemSpyEngineGenericKernelObjectContainer* CMemSpyEngineHelperKernelContainers::ObjectsAllL()
+ {
+ CMemSpyEngineGenericKernelObjectContainer* container = CMemSpyEngineGenericKernelObjectContainer::NewLC();
+ //
+ for( TInt i=EMemSpyDriverContainerTypeFirst; i<=EMemSpyDriverContainerTypeLast; i++ )
+ {
+ const TMemSpyDriverContainerType type = static_cast< TMemSpyDriverContainerType >( i );
+ //
+ CMemSpyEngineGenericKernelObjectList* list = CMemSpyEngineGenericKernelObjectList::NewLC( type, iEngine );
+ AddObjectsFromContainerL( *list, type );
+ container->AddListL( list );
+ CleanupStack::Pop( list );
+ }
+ //
+ CleanupStack::Pop( container );
+ return container;
+ }
+
+
+CMemSpyEngineGenericKernelObjectContainer* CMemSpyEngineHelperKernelContainers::ObjectsAllLightweightL()
+ {
+ CMemSpyEngineGenericKernelObjectContainer* container = CMemSpyEngineGenericKernelObjectContainer::NewLC();
+ //
+ for( TInt i=EMemSpyDriverContainerTypeFirst; i<=EMemSpyDriverContainerTypeLast; i++ )
+ {
+ const TMemSpyDriverContainerType type = static_cast< TMemSpyDriverContainerType >( i );
+ //
+ CMemSpyEngineGenericKernelObjectList* list = CMemSpyEngineGenericKernelObjectList::NewLC( type, iEngine );
+ AddObjectsFromContainerL( *list, type, EFalse );
+ container->AddListL( list );
+ CleanupStack::Pop( list );
+ }
+ //
+ CleanupStack::Pop( container );
+ return container;
+ }
+
+
+TMemSpyDriverContainerType CMemSpyEngineHelperKernelContainers::MapToType( TObjectType aType )
+ {
+ TMemSpyDriverContainerType ret = EMemSpyDriverContainerTypeUnknown;
+ //
+ if ( aType >= EMemSpyDriverContainerTypeFirst && aType <= EMemSpyDriverContainerTypeLast )
+ {
+ ret = (TMemSpyDriverContainerType) aType;
+ }
+ //
+ return ret;
+ }
+
+
+EXPORT_C void CMemSpyEngineHelperKernelContainers::OutputL( const CMemSpyEngineGenericKernelObjectContainer& aContainer ) const
+ {
+ aContainer.OutputL( iEngine.Sink() );
+ }
+
+
+CMemSpyEngine& CMemSpyEngineHelperKernelContainers::Engine() const
+ {
+ return iEngine;
+ }
+
+
+void CMemSpyEngineHelperKernelContainers::AddObjectsFromContainerL( CMemSpyEngineGenericKernelObjectList& aList, TMemSpyDriverContainerType aContainer, TBool aGetInfo )
+ {
+ TAny* handles[KMaxGenericHandleCount];
+ TInt c = KMaxGenericHandleCount;
+
+ TInt r = iEngine.Driver().GetContainerHandles( aContainer, handles, c );
+ if ( r == KErrNone )
+ {
+ if ( c > 0 )
+ {
+ if (c > KMaxGenericHandleCount)
+ {
+ c = KMaxGenericHandleCount;
+ }
+
+ TMemSpyDriverHandleInfoGeneric info;
+ for (TInt i=0; i<c && r == KErrNone; i++)
+ {
+ if ( aGetInfo )
+ {
+ r = iEngine.Driver().GetGenericHandleInfo( KMemSpyDriverEnumerateContainerHandles, aContainer, handles[i], info );
+ if ( r == KErrNone )
+ {
+ aList.AddItemL( info );
+ }
+ }
+ else
+ {
+ aList.AddItemL( handles[ i ] );
+ }
+ }
+ }
+ }
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+CMemSpyEngineGenericKernelObjectList::CMemSpyEngineGenericKernelObjectList( TMemSpyDriverContainerType aType )
+: iType( aType ), iItems( 25 ), iHandles( 25 )
+ {
+ }
+
+
+EXPORT_C CMemSpyEngineGenericKernelObjectList::~CMemSpyEngineGenericKernelObjectList()
+ {
+ delete iName;
+ iHandles.Close();
+ iItems.Close();
+ }
+
+
+void CMemSpyEngineGenericKernelObjectList::ConstructL( CMemSpyEngine& aEngine )
+ {
+ iName = HBufC::NewL( KMaxFullName );
+ iSize = aEngine.Driver().GetApproximateKernelObjectSize( iType );
+ UpdateNameL();
+ }
+
+
+CMemSpyEngineGenericKernelObjectList* CMemSpyEngineGenericKernelObjectList::NewLC( TMemSpyDriverContainerType aType, CMemSpyEngine& aEngine )
+ {
+ CMemSpyEngineGenericKernelObjectList* self = new(ELeave) CMemSpyEngineGenericKernelObjectList( aType );
+ CleanupStack::PushL( self );
+ self->ConstructL( aEngine );
+ return self;
+ }
+
+
+EXPORT_C TInt CMemSpyEngineGenericKernelObjectList::Count() const
+ {
+ return iHandles.Count();
+ }
+
+
+EXPORT_C const TMemSpyDriverHandleInfoGeneric& CMemSpyEngineGenericKernelObjectList::At( TInt aIndex ) const
+ {
+ return iItems[ aIndex ];
+ }
+
+
+EXPORT_C TMemSpyDriverContainerType CMemSpyEngineGenericKernelObjectList::Type() const
+ {
+ return iType;
+ }
+
+EXPORT_C TInt CMemSpyEngineGenericKernelObjectList::Size() const
+ {
+ return iSize;
+ }
+
+EXPORT_C TInt CMemSpyEngineGenericKernelObjectList::ItemsCount() const
+ {
+ return iItems.Count();
+ }
+
+
+EXPORT_C TPtrC CMemSpyEngineGenericKernelObjectList::TypeAsString( TMemSpyDriverContainerType aType )
+ {
+ _LIT( KTypeUnknown, "Unknown Type" );
+ _LIT( KTypeThread, "Thread" );
+ _LIT( KTypeProcess, "Process" );
+ _LIT( KTypeChunk, "Chunk" );
+ _LIT( KTypeLibrary, "Library" );
+ _LIT( KTypeSemaphore, "Semaphore" );
+ _LIT( KTypeMutex, "Mutex" );
+ _LIT( KTypeTimer, "Timer" );
+ _LIT( KTypeServer, "Server" );
+ _LIT( KTypeSession, "Session" );
+ _LIT( KTypeLogicalDevice, "Logical Device" );
+ _LIT( KTypePhysicalDevice, "Physical Device" );
+ _LIT( KTypeLogicalChannel, "Logical Channel" );
+ _LIT( KTypeChangeNotifier, "Change Notifier" );
+ _LIT( KTypeUndertaker, "Undertaker" );
+ _LIT( KTypeMsgQueue, "Msg. Queue" );
+ _LIT( KTypePropertyRef, "Property Ref." );
+ _LIT( KTypeCondVar, "Conditional Var." );
+ //
+ TPtrC pType( KTypeUnknown );
+ //
+ switch( aType )
+ {
+ case EMemSpyDriverContainerTypeThread:
+ pType.Set( KTypeThread );
+ break;
+ case EMemSpyDriverContainerTypeProcess:
+ pType.Set( KTypeProcess );
+ break;
+ case EMemSpyDriverContainerTypeChunk:
+ pType.Set( KTypeChunk );
+ break;
+ case EMemSpyDriverContainerTypeLibrary:
+ pType.Set( KTypeLibrary );
+ break;
+ case EMemSpyDriverContainerTypeSemaphore:
+ pType.Set( KTypeSemaphore );
+ break;
+ case EMemSpyDriverContainerTypeMutex:
+ pType.Set( KTypeMutex );
+ break;
+ case EMemSpyDriverContainerTypeTimer:
+ pType.Set( KTypeTimer );
+ break;
+ case EMemSpyDriverContainerTypeServer:
+ pType.Set( KTypeServer );
+ break;
+ case EMemSpyDriverContainerTypeSession:
+ pType.Set( KTypeSession );
+ break;
+ case EMemSpyDriverContainerTypeLogicalDevice:
+ pType.Set( KTypeLogicalDevice );
+ break;
+ case EMemSpyDriverContainerTypePhysicalDevice:
+ pType.Set( KTypePhysicalDevice );
+ break;
+ case EMemSpyDriverContainerTypeLogicalChannel:
+ pType.Set( KTypeLogicalChannel );
+ break;
+ case EMemSpyDriverContainerTypeChangeNotifier:
+ pType.Set( KTypeChangeNotifier );
+ break;
+ case EMemSpyDriverContainerTypeUndertaker:
+ pType.Set( KTypeUndertaker );
+ break;
+ case EMemSpyDriverContainerTypeMsgQueue:
+ pType.Set( KTypeMsgQueue );
+ break;
+ case EMemSpyDriverContainerTypePropertyRef:
+ pType.Set( KTypePropertyRef );
+ break;
+ case EMemSpyDriverContainerTypeCondVar:
+ pType.Set( KTypeCondVar );
+ break;
+
+ default:
+ break;
+ }
+ //
+ return pType;
+ }
+
+
+EXPORT_C TPtrC CMemSpyEngineGenericKernelObjectList::Name() const
+ {
+ return TPtrC( *iName );
+ }
+
+
+EXPORT_C void CMemSpyEngineGenericKernelObjectList::OutputL( CMemSpyEngineOutputSink& aSink ) const
+ {
+ // Start marker
+ aSink.OutputLineFormattedL( KMemSpyMarkerKernelContainer, &KNullDesC, iType );
+
+ TBuf<70> itemPrefix;
+ TBuf<KMaxFullName + 128> buf;
+ const TInt entryCount = Count();
+ const TInt64 size( iSize * entryCount );
+ const TMemSpySizeText sizeText( MemSpyEngineUtils::FormatSizeText( size, 0 ) );
+ //
+ _LIT(KContainerTitle, "CONTAINER \'%S\' => %d item(s), %S");
+ const TPtrC pType( TypeAsString( iType ) );
+ buf.Format(KContainerTitle, &pType, entryCount, &sizeText);
+ aSink.OutputSectionHeadingL( buf, '=' );
+ //
+ for( TInt entryIndex=0; entryIndex<entryCount; entryIndex++ )
+ {
+ const TMemSpyDriverHandleInfoGeneric& entry = At( entryIndex );
+ //
+ _LIT( KItemPrefixFormat, "[KernCont] {%04d} 0x%08x" );
+ itemPrefix.Format( KItemPrefixFormat, entryIndex, entry.iHandle );
+
+ buf.Copy( entry.iName );
+
+ aSink.OutputItemAndValueL( itemPrefix, buf );
+ }
+
+ // End marker
+ aSink.OutputBlankLineL();
+ aSink.OutputLineFormattedL( KMemSpyMarkerKernelContainer, &KMemSpySinkTagClose, iType );
+ aSink.OutputBlankLineL();
+ }
+
+
+TAny* CMemSpyEngineGenericKernelObjectList::HandleAt( TInt aIndex ) const
+ {
+ return iHandles[ aIndex ];
+ }
+
+
+void CMemSpyEngineGenericKernelObjectList::AddItemL( TAny* aHandle )
+ {
+ iHandles.InsertInAddressOrderL( aHandle );
+ }
+
+
+void CMemSpyEngineGenericKernelObjectList::AddItemL( const TMemSpyDriverHandleInfoGeneric& aItem )
+ {
+ AddItemL( aItem.iHandle );
+ iItems.AppendL( aItem );
+ //
+ //UpdateNameL();
+ }
+
+
+void CMemSpyEngineGenericKernelObjectList::UpdateNameL()
+ {
+ const TInt count = iItems.Count();
+ const TInt64 size( iSize * count );
+ const TMemSpySizeText sizeText( MemSpyEngineUtils::FormatSizeText( size, 0 ) );
+ //
+ _LIT(KNameFormat, "\t%S\t\t%d item");
+ TPtr pName( iName->Des() );
+ //
+ const TPtrC pType( TypeAsString( iType ) );
+ //
+ pName.Format( KNameFormat, &pType, count );
+ //
+ if ( count == 0 || count > 1 )
+ {
+ pName.Append( _L("s") );
+ }
+
+ pName.AppendFormat( _L(", %S"), &sizeText );
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+CMemSpyEngineGenericKernelObjectContainer::CMemSpyEngineGenericKernelObjectContainer()
+: iItems( 25 )
+ {
+ }
+
+
+EXPORT_C CMemSpyEngineGenericKernelObjectContainer::~CMemSpyEngineGenericKernelObjectContainer()
+ {
+ iItems.ResetAndDestroy();
+ iItems.Close();
+ }
+
+
+void CMemSpyEngineGenericKernelObjectContainer::ConstructL()
+ {
+ }
+
+
+CMemSpyEngineGenericKernelObjectContainer* CMemSpyEngineGenericKernelObjectContainer::NewLC()
+ {
+ CMemSpyEngineGenericKernelObjectContainer* self = new(ELeave) CMemSpyEngineGenericKernelObjectContainer();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+
+EXPORT_C TInt CMemSpyEngineGenericKernelObjectContainer::Count() const
+ {
+ return iItems.Count();
+ }
+
+
+EXPORT_C const CMemSpyEngineGenericKernelObjectList& CMemSpyEngineGenericKernelObjectContainer::At( TInt aIndex ) const
+ {
+ return *iItems[ aIndex ];
+ }
+
+
+EXPORT_C void CMemSpyEngineGenericKernelObjectContainer::OutputL( CMemSpyEngineOutputSink& aSink ) const
+ {
+ // Start marker
+ aSink.OutputLineFormattedL( KMemSpyMarkerKernelContainersAll, &KNullDesC );
+
+ const TInt listCount= Count();
+ for( TInt listIndex=0; listIndex<listCount; listIndex++ )
+ {
+ const CMemSpyEngineGenericKernelObjectList& list = At( listIndex );
+ list.OutputL( aSink );
+ }
+
+ // End marker
+ aSink.OutputLineFormattedL( KMemSpyMarkerKernelContainersAll, &KMemSpySinkTagClose );
+ }
+
+
+void CMemSpyEngineGenericKernelObjectContainer::AddListL( CMemSpyEngineGenericKernelObjectList* aList )
+ {
+ iItems.AppendL( aList );
+ }
+
+
+EXPORT_C TInt CMemSpyEngineGenericKernelObjectContainer::MdcaCount() const
+ {
+ return Count();
+ }
+
+
+EXPORT_C TPtrC CMemSpyEngineGenericKernelObjectContainer::MdcaPoint( TInt aIndex ) const
+ {
+ const CMemSpyEngineGenericKernelObjectList& item = At( aIndex );
+ return item.Name();
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+