--- a/memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectThreadInfoObjects.cpp Fri Aug 27 11:37:29 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3432 +0,0 @@
-/*
-* 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/memspyengineobjectthreadinfoobjects.h>
-
-// System includes
-#include <f32file.h>
-#include <hal.h>
-#include <kernel/arm/arm_types.h>
-#include <memspy/driver/memspydriverclient.h>
-#include <memspy/engine/memspyengine.h>
-#include <memspy/engine/memspyengineutils.h>
-#include <memspy/engine/memspyengineoutputlist.h>
-#include <memspy/engine/memspyenginehelpercodesegment.h>
-#include <memspy/engine/memspyenginehelperactiveobject.h>
-#include <memspy/engine/memspyenginehelperchunk.h>
-#include <memspy/engine/memspyenginehelperheap.h>
-#include <memspy/engine/memspyenginehelperprocess.h>
-#include <memspy/engine/memspyengineobjectprocess.h>
-#include <memspy/engine/memspyengineobjectthread.h>
-#include <memspy/engine/memspyengineobjectthreadinfocontainer.h>
-#include <memspy/engine/memspyengineoutputsink.h>
-
-// User includes
-#include "MemSpyEngineOutputListItem.h"
-
-// Constants
-const TInt KMemSpyNumericFormatBufferSize = 20;
-
-// Literal constants
-_LIT( KMemSpyNumericHexFormat, "0x%08x" );
-_LIT( KMemSpyNumericDecFormat, "%d" );
-_LIT( KMemSpyNumericLongFormat, "%Ld" );
-_LIT( KMemSpyCaptionYes, "Yes" );
-_LIT( KMemSpyCaptionNo, "No" );
-_LIT( KMemSpyCaptionOn, "On" );
-_LIT( KMemSpyCaptionOff, "Off" );
-_LIT( KMemSpyUnavailable, "Unavailable" );
-_LIT( KMemSpyDead, "Dead" );
-_LIT( KMemSpyNoItems, "(No items)" );
-
-
-
-CMemSpyThreadInfoItemBase::CMemSpyThreadInfoItemBase( CMemSpyThreadInfoContainer& aContainer, TMemSpyThreadInfoItemType aType, TBool aAsyncConstruction )
-: CMemSpyEngineObject( aContainer ), iContainer( aContainer ), iCallBack( CActive::EPriorityLow ), iType( aType )
- {
- if ( aAsyncConstruction )
- {
- TCallBack callBackMethod( CallConstructL, this );
- iCallBack.Set( callBackMethod );
- iCallBack.CallBack();
- }
- }
-
-
-CMemSpyThreadInfoItemBase::~CMemSpyThreadInfoItemBase()
- {
- TRAP_IGNORE( iContainer.NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemDestroyed, iType ) );
- //
- iItems.ResetAndDestroy();
- iItems.Close();
- }
-
-
-TInt CMemSpyThreadInfoItemBase::CallConstructL( TAny* aSelf )
- {
- CMemSpyThreadInfoItemBase* self = reinterpret_cast< CMemSpyThreadInfoItemBase* >( aSelf );
- self->iReady = EFalse;
-
- // Don't try to refresh dead thread
- TInt err = KErrNone;
- if ( !self->Container().Thread().IsDead() )
- {
- TRAP(err, self->ConstructL());
- if ( err != KErrNone )
- {
- #ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoItemBase::CallConstructL() - construction err: %d, iType: %d", err, self->iType );
- #endif
- self->AddItemL( KMemSpyUnavailable, KNullDesC );
- self->iIsEmpty = ETrue;
- }
- else if ( self->MdcaCount() == 0 )
- {
- self->AddItemL( KMemSpyNoItems, KNullDesC );
- self->iIsEmpty = ETrue;
- }
- }
- else
- {
- self->AddItemL( KMemSpyDead, KNullDesC );
- self->iIsEmpty = ETrue;
- }
- //
- self->iReady = ETrue;
- return KErrNone;
- }
-
-
-EXPORT_C TInt CMemSpyThreadInfoItemBase::MdcaCount() const
- {
- return iItems.Count();
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoItemBase::MdcaPoint( TInt aIndex ) const
- {
- CItem* item = iItems[ aIndex ];
- return TPtrC( item->Combined() );
- }
-
-EXPORT_C TPtrC CMemSpyThreadInfoItemBase::Caption(TInt aIndex ) const
- {
- CItem* item = iItems[ aIndex ];
- return TPtrC( item->Caption() );
- }
-
-EXPORT_C TPtrC CMemSpyThreadInfoItemBase::Value(TInt aIndex ) const
- {
- CItem* item = iItems[ aIndex ];
- return TPtrC( item->Value() );
- }
-
-EXPORT_C CMemSpyEngine& CMemSpyThreadInfoItemBase::Engine() const
- {
- return iContainer.Engine();
- }
-
-
-EXPORT_C void CMemSpyThreadInfoItemBase::PrintL()
- {
- const TInt count = iItems.Count();
- if ( count > 0 && !iIsEmpty )
- {
- CMemSpyEngine& engine = Engine();
- CMemSpyEngineOutputSink& sink = engine.Sink();
-
- HBufC* name = MemSpyEngineUtils::CleanupTextLC( Name() );
- sink.OutputSectionHeadingL( *name, TChar('-') );
- CleanupStack::PopAndDestroy( name );
- sink.OutputPrefixSetLC( _L(" ") ); // Slight insertion
-
- // First pass to get max lengths
- TInt maxLengthCaption = 0;
- TInt maxLengthValue = 0;
-
- for( TInt j=0; j<count; j++ )
- {
- const CItem* item = iItems[ j ];
- maxLengthCaption = Max( maxLengthCaption, item->Caption().Length() );
- maxLengthValue = Max( maxLengthValue, item->Value().Length() );
- }
-
- // Second pass - real this time - to print the values
- HBufC* line = HBufC::NewLC( ( maxLengthCaption + maxLengthValue ) + 20 );
- TPtr pLine( line->Des() );
- //
- for( TInt i=0; i<count; i++ )
- {
- const CItem* item = iItems[ i ];
-
- // Remove initial tabs in caption
- HBufC* caption = MemSpyEngineUtils::CleanupTextLC( item->Caption() );
-
- // Create value item & replace any further tabs
- HBufC* value = MemSpyEngineUtils::CleanupTextLC( item->Value() );
-
- // Now format the final line, with padding.
- pLine.Justify( *caption, maxLengthCaption + 3, ELeft, TChar(' ') );
- pLine.Append( *value );
- CleanupStack::PopAndDestroy( 2, caption );
-
- // Sink output
- sink.OutputLineL( pLine );
- }
- //
- CleanupStack::PopAndDestroy( line );
- sink.OutputBlankLineL();
- CleanupStack::PopAndDestroy(); // clear prefix
- }
- }
-
-
-
-void CMemSpyThreadInfoItemBase::AddItemL( const TDesC& aCaption, const TDesC& aValue )
- {
- CItem* item = CItem::NewLC( aCaption, aValue );
- iItems.AppendL( item );
- CleanupStack::Pop( item );
- }
-
-
-void CMemSpyThreadInfoItemBase::AddItemHexL( const TDesC& aCaption, TUint aValue )
- {
- TBuf<KMemSpyNumericFormatBufferSize> val;
- val.Format( KMemSpyNumericHexFormat, aValue );
- AddItemL( aCaption, val );
- }
-
-
-void CMemSpyThreadInfoItemBase::AddItemDecimalL( const TDesC& aCaption, TInt aValue )
- {
- TBuf<KMemSpyNumericFormatBufferSize> val;
- val.Format( KMemSpyNumericDecFormat, aValue );
- AddItemL( aCaption, val );
- }
-
-
-void CMemSpyThreadInfoItemBase::AddItemLongL( const TDesC& aCaption, const TInt64& aValue )
- {
- TBuf<KMemSpyNumericFormatBufferSize> val;
- val.Format( KMemSpyNumericLongFormat, aValue );
- AddItemL( aCaption, val );
- }
-
-
-void CMemSpyThreadInfoItemBase::AddItemYesNoL( const TDesC& aCaption, TBool aYes )
- {
- CItem* item = CItem::NewYesNoLC( aCaption, aYes );
- iItems.AppendL( item );
- CleanupStack::Pop( item );
- }
-
-
-void CMemSpyThreadInfoItemBase::AddItemOnOffL( const TDesC& aCaption, TBool aOn )
- {
- CItem* item = CItem::NewOnOffLC( aCaption, aOn );
- iItems.AppendL( item );
- CleanupStack::Pop( item );
- }
-
-
-void CMemSpyThreadInfoItemBase::AddItemPercentageL( const TDesC& aCaption, TInt aOneHundredPercentValue, TInt aValue )
- {
- const TMemSpyPercentText val( MemSpyEngineUtils::FormatPercentage( TReal( aOneHundredPercentValue ), TReal( aValue ) ) );
- AddItemL( aCaption, val );
- }
-
-
-EXPORT_C void CMemSpyThreadInfoItemBase::RebuildL()
- {
- Reset();
- CallConstructL( this );
- }
-
-
-EXPORT_C TBool CMemSpyThreadInfoItemBase::IsReady() const
- {
- return iReady;
- }
-
-
-EXPORT_C TMemSpyThreadInfoItemType CMemSpyThreadInfoItemBase::Type() const
- {
- return iType;
- }
-
-
-void CMemSpyThreadInfoItemBase::Reset()
- {
- iItems.ResetAndDestroy();
- }
-
-
-void CMemSpyThreadInfoItemBase::StripProcessAndThreadNames( TDes& aText )
- {
- StripProcessName( aText );
- StripThreadName( aText );
- }
-
-
-void CMemSpyThreadInfoItemBase::StripProcessName( TDes& aText )
- {
- CMemSpyProcess& process = Container().Thread().Process();
- const TPtrC processName( process.Name() );
- TFullName temp;
- //
- _LIT( KProcessNameUidFormat1, "%S.exe[%08x]" );
- temp.Format( KProcessNameUidFormat1, &processName, process.SID() );
- const TBool stripped = MemSpyEngineUtils::StripText( aText, temp );
- //
- if ( stripped == EFalse )
- {
- _LIT( KProcessNameUidFormat2, "%S[%08x]" );
- temp.Format( KProcessNameUidFormat2, &processName, process.SID() );
- MemSpyEngineUtils::StripText( aText, temp );
- }
- }
-
-
-void CMemSpyThreadInfoItemBase::StripThreadName( TDes& aText )
- {
- CMemSpyThread& thread = Container().Thread();
- const TPtrC threadName( thread.Name() );
- const TBool stripped = MemSpyEngineUtils::StripText( aText, threadName );
- (void) stripped;
- }
-
-
-CMemSpyThreadInfoItemBase::CItem& CMemSpyThreadInfoItemBase::Item( TInt aIndex )
- {
- CItem* item = iItems[ aIndex ];
- return *item;
- }
-
-
-const CMemSpyThreadInfoItemBase::CItem& CMemSpyThreadInfoItemBase::Item( TInt aIndex ) const
- {
- const CItem* item = iItems[ aIndex ];
- return *item;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoItemBase::CItem::CItem()
- {
- }
-
-
-CMemSpyThreadInfoItemBase::CItem::~CItem()
- {
- delete iCaption;
- delete iValue;
- delete iCombined;
- }
-
-
-void CMemSpyThreadInfoItemBase::CItem::ConstructL( const TDesC& aCaption, const TDesC& aValue )
- {
- iCaption = aCaption.AllocL();
- iValue = aValue.AllocL();
- //
- UpdateCombinedL();
- }
-
-
-CMemSpyThreadInfoItemBase::CItem* CMemSpyThreadInfoItemBase::CItem::NewLC( const CItem& aCopyMe )
- {
- CItem* self = new(ELeave) CItem();
- CleanupStack::PushL( self );
- self->ConstructL( aCopyMe.Caption(), aCopyMe.Value() );
- return self;
- }
-
-
-CMemSpyThreadInfoItemBase::CItem* CMemSpyThreadInfoItemBase::CItem::NewLC( const TDesC& aCaption )
- {
- CItem* self = new(ELeave) CItem();
- CleanupStack::PushL( self );
- self->ConstructL( aCaption, KNullDesC );
- return self;
- }
-
-
-CMemSpyThreadInfoItemBase::CItem* CMemSpyThreadInfoItemBase::CItem::NewLC( const TDesC& aCaption, const TDesC& aValue )
- {
- CItem* self = new(ELeave) CItem();
- CleanupStack::PushL( self );
- self->ConstructL( aCaption, aValue );
- return self;
- }
-
-
-CMemSpyThreadInfoItemBase::CItem* CMemSpyThreadInfoItemBase::CItem::NewHexLC( const TDesC& aCaption, TUint aValue )
- {
- CItem* ret = CItem::NewLC( aCaption );
- ret->SetHexL( aValue );
- return ret;
- }
-
-
-CMemSpyThreadInfoItemBase::CItem* CMemSpyThreadInfoItemBase::CItem::NewDecimalLC( const TDesC& aCaption, TInt aValue )
- {
- CItem* ret = CItem::NewLC( aCaption );
- ret->SetDecimalL( aValue );
- return ret;
- }
-
-
-CMemSpyThreadInfoItemBase::CItem* CMemSpyThreadInfoItemBase::CItem::NewLongLC( const TDesC& aCaption, const TInt64& aValue )
- {
- CItem* ret = CItem::NewLC( aCaption );
- ret->SetLongL( aValue );
- return ret;
- }
-
-
-CMemSpyThreadInfoItemBase::CItem* CMemSpyThreadInfoItemBase::CItem::NewYesNoLC( const TDesC& aCaption, TBool aYes )
- {
- CItem* ret = CItem::NewLC( aCaption );
- ret->SetYesNoL( aYes );
- return ret;
- }
-
-
-CMemSpyThreadInfoItemBase::CItem* CMemSpyThreadInfoItemBase::CItem::NewOnOffLC( const TDesC& aCaption, TBool aOn )
- {
- CItem* ret = CItem::NewLC( aCaption );
- ret->SetOnOffL( aOn );
- return ret;
- }
-
-
-CMemSpyThreadInfoItemBase::CItem* CMemSpyThreadInfoItemBase::CItem::NewPercentageLC( const TDesC& aCaption, TInt aOneHundredPercentValue, TInt aValue )
- {
- CItem* ret = CItem::NewLC( aCaption );
- ret->SetPercentageL( aOneHundredPercentValue, aValue );
- return ret;
- }
-
-
-void CMemSpyThreadInfoItemBase::CItem::SetValueL( const TDesC& aValue )
- {
- if ( iValue == NULL )
- {
- iValue = aValue.AllocL();
- }
- else
- {
- if ( iValue->Des().MaxLength() < aValue.Length() )
- {
- iValue = iValue->ReAllocL( aValue.Length() );
- }
-
- // Now its safe to assign new content
- *iValue = aValue;
- }
-
- UpdateCombinedL();
- }
-
-
-void CMemSpyThreadInfoItemBase::CItem::SetHexL( TUint aValue )
- {
- TBuf<KMemSpyNumericFormatBufferSize> val;
- val.Format( KMemSpyNumericHexFormat, aValue );
- SetValueL( val );
- }
-
-
-void CMemSpyThreadInfoItemBase::CItem::SetDecimalL( TInt aValue )
- {
- TBuf<KMemSpyNumericFormatBufferSize> val;
- val.Format( KMemSpyNumericDecFormat, aValue );
- SetValueL( val );
- }
-
-
-void CMemSpyThreadInfoItemBase::CItem::SetLongL( const TInt64& aValue )
- {
- TBuf<KMemSpyNumericFormatBufferSize> val;
- val.Format( KMemSpyNumericLongFormat, aValue );
- SetValueL( val );
- }
-
-
-void CMemSpyThreadInfoItemBase::CItem::SetYesNoL( TBool aYes )
- {
- if ( aYes )
- {
- SetValueL( KMemSpyCaptionYes );
- }
- else
- {
- SetValueL( KMemSpyCaptionNo );
- }
- }
-
-
-void CMemSpyThreadInfoItemBase::CItem::SetOnOffL( TBool aOn )
- {
- if ( aOn )
- {
- SetValueL( KMemSpyCaptionOn );
- }
- else
- {
- SetValueL( KMemSpyCaptionOff );
- }
- }
-
-
-void CMemSpyThreadInfoItemBase::CItem::SetPercentageL( TInt aOneHundredPercentValue, TInt aValue )
- {
- const TMemSpyPercentText val( MemSpyEngineUtils::FormatPercentage( TReal( aOneHundredPercentValue ), TReal( aValue ) ) );
- SetValueL( val );
- }
-
-
-void CMemSpyThreadInfoItemBase::CItem::UpdateCombinedL()
- {
- const TInt requiredLength = Caption().Length() + Value().Length() + 10;
- //
- if ( iCombined == NULL )
- {
- iCombined = HBufC::NewL( requiredLength );
- }
- else if ( iCombined->Des().MaxLength() < requiredLength )
- {
- iCombined = iCombined->ReAllocL( requiredLength );
- }
-
- TPtr pCombined( iCombined->Des() );
- pCombined.Zero();
- pCombined.Append( _L("\t") );
- pCombined.Append( Caption() );
- pCombined.Append( _L("\t\t") );
- pCombined.Append( Value() );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoGeneral::CMemSpyThreadInfoGeneral( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoItemBase( aContainer, EMemSpyThreadInfoItemTypeGeneralInfo, aAsyncConstruction )
- {
- }
-
-
-void CMemSpyThreadInfoGeneral::ConstructL()
- {
- TBuf<50> temp;
- RThread thread;
- Container().Thread().OpenLC( thread );
- const CMemSpyProcess& process = Container().Thread().Process();
-
- _LIT( KItem1, "Thread Id" );
- AddItemLongL( KItem1, thread.Id() );
-
- _LIT( KItem1a, "Process Id" );
- AddItemLongL( KItem1a, (TUint) process.Id() );
-
- _LIT( KItem1b, "SID" );
- AddItemHexL( KItem1b, process.SID() );
-
- _LIT( KItem1c, "VID" );
- AddItemHexL( KItem1c, process.VID() );
-
- _LIT( KItem2, "Thread Priority" );
- CMemSpyThread::AppendPriority( temp, thread.Priority() );
- AddItemL( KItem2, temp );
- temp.Zero();
-
- _LIT( KItem3, "Process Priority" );
- CMemSpyProcess::AppendPriority( temp, thread.ProcessPriority() );
- AddItemL( KItem3, temp );
- temp.Zero();
-
- _LIT( KItem4, "Request Count" );
- AddItemDecimalL( KItem4, thread.RequestCount() );
-
- TInt processHandleCount = 0;
- TInt threadHandleCount = 0;
- thread.HandleCount( processHandleCount, threadHandleCount );
-
- _LIT( KItem5a, "Process Handles" );
- AddItemDecimalL( KItem5a, processHandleCount );
-
- _LIT( KItem5b, "Thread Handles" );
- AddItemDecimalL( KItem5b, threadHandleCount );
-
- // Thread handle info
- THandleInfo handleInfo;
- thread.HandleInfo( &handleInfo );
-
- _LIT( KItem5c, "Num. Proc. (Using)" );
- AddItemDecimalL( KItem5c, handleInfo.iNumProcesses );
-
- _LIT( KItem5d, "Num. Thread (Using)" );
- AddItemDecimalL( KItem5d, handleInfo.iNumThreads );
-
- _LIT( KItem5e, "Attributes" );
- AddItemDecimalL( KItem5e, thread.Attributes() );
-
- // CPU time (request special kernel build)
- TTimeIntervalMicroSeconds cpuTime;
- if ( thread.GetCpuTime( cpuTime ) == KErrNone )
- {
- _LIT( KItem5f, "CPU Time (us)" );
- const TInt64 time = cpuTime.Int64();
- AddItemLongL( KItem5f, time );
- }
-
- // Exit info
- _LIT( KItem6, "Exit Type" );
- CMemSpyThread::AppendExitType( temp, thread.ExitType() );
- AddItemL( KItem6, temp );
- temp.Zero();
-
- if ( thread.ExitType() != EExitPending )
- {
- _LIT( KItem7, "Exit Reason" );
- AddItemDecimalL( KItem7, thread.ExitReason() );
-
- _LIT( KItem8, "Exit Category" );
- const TExitCategoryName cat( thread.ExitCategory() );
- AddItemL( KItem8, cat );
- }
-
- // Registers
- MakeRegisterListingL( thread );
-
- CleanupStack::PopAndDestroy( &thread );
-
- Container().NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemChanged, Type() );
- }
-
-
-CMemSpyThreadInfoGeneral* CMemSpyThreadInfoGeneral::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoGeneral* self = new(ELeave) CMemSpyThreadInfoGeneral( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoGeneral::Name() const
- {
- _LIT(KName, "\tGeneral");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoGeneral::MakeRegisterListingL( RThread& aThread )
- {
-#ifndef __WINS__
- _LIT(KRegFormatGeneral, "R%02d");
- _LIT(KRegFormatSP, "SP");
- _LIT(KRegFormatLR, "LR");
- _LIT(KRegFormatPC, "PC");
- _LIT(KRegFormatFlags, "Flags");
- _LIT(KRegFormatDACR, "DACR"); // Data access control register
- //
- TArmRegSet regList;
- TPckg<TArmRegSet> pRegList( regList );
- //
- aThread.Context( pRegList );
- TArmReg* pReg = reinterpret_cast<TArmReg*>( ®List );
- //
- for( TInt i=0; i<KArmRegisterCount; i++ )
- {
- const TArmReg regValue = pReg[ i ];
- //
- if ( i <= EArmR12 )
- {
- TBuf<128> buf;
- buf.Format( KRegFormatGeneral, i );
- AddItemHexL( buf, regValue );
- }
- else
- {
- TPtrC pCaption( KRegFormatGeneral );
- //
- if ( i == EArmSp )
- {
- pCaption.Set( KRegFormatSP );
- }
- else if ( i == EArmLr )
- {
- pCaption.Set( KRegFormatLR );
- }
- else if ( i == EArmPc )
- {
- pCaption.Set( KRegFormatPC );
- }
- else if ( i == EArmFlags )
- {
- pCaption.Set( KRegFormatFlags );
- }
- else if ( i == EArmDacr )
- {
- pCaption.Set( KRegFormatDACR );
- }
- //
- AddItemHexL( pCaption, regValue );
- }
- }
-#else
- (void) aThread;
-#endif
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoHeap::CMemSpyThreadInfoHeap( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoItemBase( aContainer, EMemSpyThreadInfoItemTypeHeap, aAsyncConstruction )
- {
- }
-
-
-void CMemSpyThreadInfoHeap::ConstructL()
- {
- CMemSpyEngineHelperHeap& heapHelper = Engine().HelperHeap();
-
- // Get heap info first of all
- TMemSpyHeapInfo info;
- heapHelper.GetHeapInfoUserL( Container().Thread().Process().Id(), Container().Thread().Id(), info );
- CMemSpyEngineOutputList* list = heapHelper.NewHeapSummaryShortLC( info );
-
- // Now add each item to our view
- const TInt count = list->Count();
- for( TInt i=0; i<count; i++ )
- {
- const CMemSpyEngineOutputListItem& item = list->Item( i );
- //
- AddItemL( item.Caption(), item.Value() );
- }
-
- // Tidy up
- CleanupStack::PopAndDestroy( list );
- Container().NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemChanged, Type() );
- }
-
-
-CMemSpyThreadInfoHeap* CMemSpyThreadInfoHeap::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoHeap* self = new(ELeave) CMemSpyThreadInfoHeap( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoHeap::Name() const
- {
- _LIT(KName, "\tHeap");
- return TPtrC( KName );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoActiveObjects::CMemSpyThreadInfoActiveObjects( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoItemBase( aContainer, EMemSpyThreadInfoItemTypeActiveObject, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoActiveObjects::~CMemSpyThreadInfoActiveObjects()
- {
- delete iItems;
- }
-
-
-void CMemSpyThreadInfoActiveObjects::ConstructL()
- {
- CMemSpyEngine& engine = Container().Thread().Process().Engine();
- engine.ProcessSuspendLC( Container().Thread().Process().Id() );
- //
- CMemSpyEngineActiveObjectArray* activeObjects = engine.HelperActiveObject().ActiveObjectListL( Container().Thread() );
- delete iItems;
- iItems = activeObjects;
- //
- CleanupStack::PopAndDestroy(); // ProcessSuspendLC
-
- Container().NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemChanged, Type() );
- }
-
-
-CMemSpyThreadInfoActiveObjects* CMemSpyThreadInfoActiveObjects::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoActiveObjects* self = new(ELeave) CMemSpyThreadInfoActiveObjects( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoActiveObjects::Name() const
- {
- _LIT(KName, "\tActive Objects");
- return TPtrC( KName );
- }
-
-
-EXPORT_C TInt CMemSpyThreadInfoActiveObjects::MdcaCount() const
- {
- TInt count = 0;
- //
- if ( iItems )
- {
- count = iItems->MdcaCount();
- }
- //
- return count;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoActiveObjects::MdcaPoint(TInt aIndex) const
- {
- TPtrC ret( KNullDesC );
- //
- if ( iItems )
- {
- ret.Set( iItems->MdcaPoint( aIndex ) );
- }
- //
- return ret;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoOpenFiles::CMemSpyThreadInfoOpenFiles( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoItemBase( aContainer, EMemSpyThreadInfoItemTypeOpenFiles, aAsyncConstruction )
- {
- }
-
-
-void CMemSpyThreadInfoOpenFiles::ConstructL()
- {
- _LIT(KSpace, " ");
- //
- const TThreadId myThreadId = Container().Thread().Id();
- CMemSpyEngine& engine = Container().Thread().Process().Engine();
- RFs& fsSession = engine.FsSession();
- //
- TMemSpySizeText valueBuf;
- TBuf<128> timeBuf;
- TOpenFileScan scanner( fsSession );
- //
- CFileList* list = NULL;
- scanner.NextL( list );
-
- while( list != NULL )
- {
- if ( scanner.ThreadId() == myThreadId )
- {
- CleanupStack::PushL( list );
-
- const TInt entryCount = list->Count();
- for(TInt i=0; i<entryCount; i++)
- {
- const TEntry& entry = (*list)[ i ];
-
- // Get time and size format strings
- valueBuf = MemSpyEngineUtils::FormatSizeText( entry.iSize );
- MemSpyEngineUtils::FormatTimeL( timeBuf, entry.iModified );
- timeBuf.Insert( 0, KSpace );
- timeBuf.Insert( 0, valueBuf );
-
- // Get just file name
- TParsePtrC parser( entry.iName );
- const TPtrC pJustName( parser.NameAndExt() );
-
- // Create item
- AddItemL( pJustName, timeBuf );
- }
-
- CleanupStack::Pop( list );
- }
-
- delete list;
- list = NULL;
- scanner.NextL( list );
- }
-
- Container().NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemChanged, Type() );
- }
-
-
-CMemSpyThreadInfoOpenFiles* CMemSpyThreadInfoOpenFiles::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoOpenFiles* self = new(ELeave) CMemSpyThreadInfoOpenFiles( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoOpenFiles::Name() const
- {
- _LIT(KName, "\tOpen Files");
- return TPtrC( KName );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoStack::CMemSpyThreadInfoStack( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoItemBase( aContainer, EMemSpyThreadInfoItemTypeStack, aAsyncConstruction )
- {
- }
-
-
-void CMemSpyThreadInfoStack::ConstructL()
- {
- CMemSpyEngine& engine = Container().Thread().Process().Engine();
- engine.ProcessSuspendLC( Container().Thread().Process().Id() );
- //
- TMemSpyDriverStackInfo info;
- const TInt error = engine.Driver().GetStackInfo( Container().Thread().Id(), info );
- User::LeaveIfError( error );
-
- _LIT( KItem1, "Size" );
- AddItemDecimalL( KItem1, info.iUserStackSize );
-
-#ifndef __WINS__
- const TInt userStackUsage = (TInt) ( info.iUserStackBase + info.iUserStackSize ) - info.iUserStackPointer;
- const TInt userStackHighWaterMarkUsage = (TInt) ( info.iUserStackBase + info.iUserStackSize ) - info.iUserStackHighWatermark;
-
- _LIT( KItem2, "Stack used" );
- AddItemDecimalL( KItem2, userStackUsage );
-
- _LIT( KItem3, "(percentage)" );
- AddItemPercentageL( KItem3, info.iUserStackSize, userStackUsage );
-
- _LIT( KItem4, "High watermark" );
- AddItemDecimalL( KItem4, userStackHighWaterMarkUsage );
-
- _LIT( KItem5, "(percentage)" );
- AddItemPercentageL( KItem5, info.iUserStackSize, userStackHighWaterMarkUsage );
-#endif
-
- _LIT( KItem6, "Base address" );
- AddItemHexL( KItem6, info.iUserStackBase );
-
-#ifndef __WINS__
- _LIT( KItem7, "Current pointer" );
- AddItemHexL( KItem7, info.iUserStackPointer );
-#endif
- //
- CleanupStack::PopAndDestroy(); // ProcessSuspendLC
-
- Container().NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemChanged, Type() );
- }
-
-
-CMemSpyThreadInfoStack* CMemSpyThreadInfoStack::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoStack* self = new(ELeave) CMemSpyThreadInfoStack( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoStack::Name() const
- {
- _LIT(KName, "\tStack");
- return TPtrC( KName );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoChunk::CMemSpyThreadInfoChunk( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoItemBase( aContainer, EMemSpyThreadInfoItemTypeChunk, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoChunk::~CMemSpyThreadInfoChunk()
- {
- delete iList;
- }
-
-
-void CMemSpyThreadInfoChunk::ConstructL()
- {
- CMemSpyEngine& engine = Container().Thread().Process().Engine();
- engine.ProcessSuspendLC( Container().Thread().Process().Id() );
- //
- CMemSpyEngineChunkList* list = engine.HelperChunk().ListForThreadL( Container().Thread().Id() );
- delete iList;
- iList = list;
- //
- CleanupStack::PopAndDestroy(); // ProcessSuspendLC
-
- Container().NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemChanged, Type() );
- }
-
-
-CMemSpyThreadInfoChunk* CMemSpyThreadInfoChunk::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoChunk* self = new(ELeave) CMemSpyThreadInfoChunk( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoChunk::Name() const
- {
- _LIT(KName, "\tChunks");
- return TPtrC( KName );
- }
-
-
-EXPORT_C TInt CMemSpyThreadInfoChunk::MdcaCount() const
- {
- TInt count = 0;
- //
- if ( iList )
- {
- count = iList->MdcaCount();
- }
- //
- return count;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoChunk::MdcaPoint(TInt aIndex) const
- {
- TPtrC ret( KNullDesC );
- //
- if ( iList )
- {
- ret.Set( iList->MdcaPoint( aIndex ) );
- }
- //
- return ret;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoCodeSeg::CMemSpyThreadInfoCodeSeg( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoItemBase( aContainer, EMemSpyThreadInfoItemTypeCodeSeg, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoCodeSeg::~CMemSpyThreadInfoCodeSeg()
- {
- delete iList;
- }
-
-
-void CMemSpyThreadInfoCodeSeg::ConstructL()
- {
- CMemSpyEngine& engine = Container().Thread().Process().Engine();
- engine.ProcessSuspendLC( Container().Thread().Process().Id() );
- //
- CMemSpyEngineCodeSegList* list = engine.HelperCodeSegment().CodeSegmentListL( Container().Thread().Process().Id() );
- delete iList;
- iList = list;
- //
- CleanupStack::PopAndDestroy(); // ProcessSuspendLC
-
- Container().NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemChanged, Type() );
- }
-
-
-CMemSpyThreadInfoCodeSeg* CMemSpyThreadInfoCodeSeg::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoCodeSeg* self = new(ELeave) CMemSpyThreadInfoCodeSeg( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoCodeSeg::Name() const
- {
- _LIT(KName, "\tCode Segments");
- return TPtrC( KName );
- }
-
-
-EXPORT_C TInt CMemSpyThreadInfoCodeSeg::MdcaCount() const
- {
- TInt count = 0;
- //
- if ( iList )
- {
- count = iList->MdcaCount();
- }
- //
- return count;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoCodeSeg::MdcaPoint(TInt aIndex) const
- {
- TPtrC ret( KNullDesC );
- //
- if ( iList )
- {
- ret.Set( iList->MdcaPoint( aIndex ) );
- }
- //
- return ret;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoHandleObjectBase::CMemSpyThreadInfoHandleObjectBase( CMemSpyThreadInfoContainer& aContainer, TMemSpyThreadInfoItemType aItemType, TMemSpyDriverContainerType aContainerType, TBool aAsyncConstruction )
-: CMemSpyThreadInfoItemBase( aContainer, aItemType, aAsyncConstruction ), iContainerType( aContainerType )
- {
- }
-
-
-CMemSpyThreadInfoHandleObjectBase::~CMemSpyThreadInfoHandleObjectBase()
- {
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoHandleObjectBase::~CMemSpyThreadInfoHandleObjectBase() - this: 0x%08x", this );
-#endif
- iInfoItems.Close();
- }
-
-
-void CMemSpyThreadInfoHandleObjectBase::ConstructL()
- {
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoHandleObjectBase::ConstructL() - START" );
-#endif
- iInfoItems.Reset();
- //
- CMemSpyProcess& process = Container().Thread().Process();
- CMemSpyEngine& engine = process.Engine();
- engine.ProcessSuspendLC( process.Id() );
- //
- RArray<THandleWrapper> handles;
- CleanupClosePushL( handles );
- GetHandlesL( handles );
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoHandleObjectBase::ConstructL() - got %d handle entries...", handles.Count() );
-#endif
- //
- TFullName name;
- TMemSpyDriverHandleInfoGeneric info;
- //
- const TInt count = handles.Count();
- for (TInt i=0; i<count; i++)
- {
- const THandleWrapper& handleWrapper = handles[ i ];
- //
- const TInt r = engine.Driver().GetGenericHandleInfo( Container().Thread().Id(), handleWrapper.iType, handleWrapper.iHandle, info );
- //
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoHandleObjectBase::ConstructL() - handle[%3d] 0x%08x, type: %d, refCount: %d, r: %d", i, handleWrapper.iHandle, handleWrapper.iType, handleWrapper.iRefCount, r );
-#endif
- //
- if (r == KErrNone)
- {
- name.Copy( info.iName );
-#ifdef _DEBUG
- RDebug::Print( _L( "CMemSpyThreadInfoHandleObjectBase::ConstructL() - HANDLE [%3d] %S"), handleWrapper.iRefCount, &name );
-#endif
- StripProcessAndThreadNames( name );
- //
- iInfoItems.AppendL( info );
- HandleContainerItemL( info, handleWrapper.iRefCount, name );
- }
- }
-
- CleanupStack::PopAndDestroy( &handles );
- CleanupStack::PopAndDestroy(); // ProcessSuspendLC
-
- HandleAllItemsLocatedL();
-
- Container().NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemChanged, Type() );
- }
-
-
-TBool CMemSpyThreadInfoHandleObjectBase::THandleWrapper::Match( const THandleWrapper& aLeft, const THandleWrapper& aRight )
- {
- return ( aLeft.iHandle == aRight.iHandle );
- }
-
-
-EXPORT_C TInt CMemSpyThreadInfoHandleObjectBase::DetailsIndexByEntry( const TMemSpyDriverHandleInfoGeneric& aEntry ) const
- {
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoHandleObjectBase::DetailsIndexByEntry() - START - this: 0x%08x, aEntry.iHandle: 0x%08x", this, aEntry.iHandle );
-#endif
- //
- const TInt ret = DetailsIndexByHandle( aEntry.iHandle );
- //
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoHandleObjectBase::DetailsIndexByEntry() - END - ret: %d", ret );
-#endif
- return ret;
- }
-
-
-EXPORT_C TInt CMemSpyThreadInfoHandleObjectBase::DetailsIndexByHandle( TAny* aHandle ) const
- {
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoHandleObjectBase::DetailsIndexByHandle() - START - this: 0x%08x, aHandle: 0x%08x", this, aHandle );
-#endif
- TInt ret = KErrNotFound;
- //
- const TInt count = DetailsCount();
- for(TInt i=0; i<count; i++)
- {
- const TMemSpyDriverHandleInfoGeneric& item = DetailsAt( i );
- if ( item.iHandle == aHandle )
- {
- ret = i;
- break;
- }
- }
- //
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoHandleObjectBase::DetailsIndexByHandle() - END - ret: %d", ret );
-#endif
- return ret;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoHandleByContainer::CMemSpyThreadInfoHandleByContainer( CMemSpyThreadInfoContainer& aContainer, TMemSpyThreadInfoItemType aItemType, TMemSpyDriverContainerType aContainerType, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleObjectBase( aContainer, aItemType, aContainerType, aAsyncConstruction )
- {
- }
-
-
-void CMemSpyThreadInfoHandleByContainer::GetHandlesL( RArray<THandleWrapper>& aArray )
- {
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoHandleByContainer::GetHandlesL() - START - container: %d", ContainerType() );
-#endif
-
- aArray.Reset();
-
- // Our handles will be stored here... duplicates are filtered out
- TInt r = KErrNone;
- TInt c = KMemSpyDefaultMaxHandleCount;
- TAny* handles[ KMemSpyDefaultMaxHandleCount ];
-
- CMemSpyProcess& process = Container().Thread().Process();
- CMemSpyEngine& engine = process.Engine();
- TIdentityRelation<CMemSpyThreadInfoHandleObjectBase::THandleWrapper> finder( THandleWrapper::Match );
-
- // First get the handles for the process
- if ( r == KErrNone )
- {
- c = KMemSpyDefaultMaxHandleCount;
- r = engine.Driver().GetProcessHandlesByType( process.Id(), ContainerType(), handles, c );
- if ( r == KErrNone && c > 0 )
- {
- c = Min( c, KMemSpyDefaultMaxHandleCount );
- for( TInt i=0; i<c; i++ )
- {
- TAny* handle = handles[ i ];
-
- // Create temporary entry that we'll use as the key in our array...
- CMemSpyThreadInfoHandleObjectBase::THandleWrapper entry( handle, ContainerType() );
-
- // Find existing duplicate entry (if there is one...)
- const TInt errorOrIndex = aArray.Find( entry, finder );
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoHandleByContainer::GetHandlesL() - PROC[%03d/%03d] - handle: 0x%08x, foundIndex: %d", i+1, c, handle, errorOrIndex );
-#endif
-
- if ( errorOrIndex == KErrNotFound )
- {
- // Not a duplicate handle, so keep it
- aArray.AppendL( entry );
-#ifdef _DEBUG
- RDebug::Printf( " new entry: 0x%08x", handle );
-#endif
- }
- else if ( errorOrIndex >= 0 )
- {
- // Increment reference count for duplicates...
- CMemSpyThreadInfoHandleObjectBase::THandleWrapper& existingEntry = aArray[ errorOrIndex ];
- ++existingEntry.iRefCount;
-#ifdef _DEBUG
- RDebug::Printf( " dupe entry - count is now: %d", existingEntry.iRefCount );
-#endif
- }
- }
- }
- }
-
- // Next get the handles for the thread
- if ( r == KErrNone )
- {
- c = KMemSpyDefaultMaxHandleCount;
- r = engine.Driver().GetThreadHandlesByType( Container().Thread().Id(), ContainerType(), handles, c );
- if ( r == KErrNone && c > 0 )
- {
- c = Min( c, KMemSpyDefaultMaxHandleCount );
- for( TInt i=0; i<c; i++ )
- {
- TAny* handle = handles[ i ];
-
- // Create temporary entry that we'll use as the key in our array...
- CMemSpyThreadInfoHandleObjectBase::THandleWrapper entry( handle, ContainerType() );
-
- // Find existing duplicate entry (if there is one...)
- const TInt errorOrIndex = aArray.Find( entry, finder );
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoHandleByContainer::GetHandlesL() - THRD[%03d/%03d] - handle: 0x%08x, foundIndex: %d", i+1, c, handle, errorOrIndex );
-#endif
-
- if ( errorOrIndex == KErrNotFound )
- {
- // Not a duplicate handle, so keep it
- aArray.AppendL( entry );
-#ifdef _DEBUG
- RDebug::Printf( " new entry: 0x%08x", handle );
-#endif
- }
- else if ( errorOrIndex >= 0 )
- {
- // Increment reference count for duplicates...
- CMemSpyThreadInfoHandleObjectBase::THandleWrapper& existingEntry = aArray[ errorOrIndex ];
- ++existingEntry.iRefCount;
-#ifdef _DEBUG
- RDebug::Printf( " dupe entry - count is now: %d", existingEntry.iRefCount );
-#endif
- }
- }
- }
- }
-
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoHandleByContainer::GetHandlesL() - final handle listing: " );
-
- const TInt finalCount = aArray.Count();
- for( TInt i=0; i<finalCount; i++ )
- {
- const THandleWrapper& handle = aArray[ i ];
- RDebug::Printf( "entry[%03d/%03d] - handle: 0x%08x, type: %d, refCount: %d", i+1, finalCount, handle.iHandle, handle.iType, handle.iRefCount );
- }
-
- RDebug::Printf( "CMemSpyThreadInfoHandleByContainer::GetHandlesL() - END - container: %d, finalCount: %d", ContainerType(), finalCount );
-#endif
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoServer::CMemSpyThreadInfoServer( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleByContainer( aContainer, EMemSpyThreadInfoItemTypeServer, EMemSpyDriverContainerTypeServer, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoServer* CMemSpyThreadInfoServer::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoServer* self = new(ELeave) CMemSpyThreadInfoServer( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoServer::Name() const
- {
- _LIT(KName, "\tServers Running in Thread");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoServer::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& /*aItem*/, TInt /*aRefCount*/, TDes& aFullName )
- {
- AddItemL( aFullName, KNullDesC );
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoServer::SessionType( TIpcSessionType aType )
- {
- _LIT( KUnsharable, "Unsharable" );
- _LIT( KSharable, "Sharable" );
- _LIT( KGlobalSharable, "Global Sharable" );
- //
- TPtrC pType(KNullDesC);
- switch( aType )
- {
- case EIpcSession_Unsharable:
- pType.Set( KUnsharable );
- break;
- case EIpcSession_Sharable:
- pType.Set( KSharable );
- break;
- case EIpcSession_GlobalSharable:
- pType.Set( KGlobalSharable );
- break;
- default:
- pType.Set( KMemSpyUnavailable );
- break;
- }
- //
- return pType;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoSession::CMemSpyThreadInfoSession( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleByContainer( aContainer, EMemSpyThreadInfoItemTypeSession, EMemSpyDriverContainerTypeSession, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoSession::~CMemSpyThreadInfoSession()
- {
- iServerNames.ResetAndDestroy();
- iServerNames.Close();
- }
-
-
-CMemSpyThreadInfoSession* CMemSpyThreadInfoSession::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoSession* self = new(ELeave) CMemSpyThreadInfoSession( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoSession::Name() const
- {
- _LIT(KName, "\tClient <-> Server\nConnections");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoSession::Reset()
- {
- CMemSpyThreadInfoHandleByContainer::Reset();
- iServerNames.ResetAndDestroy();
- }
-
-
-EXPORT_C TInt CMemSpyThreadInfoSession::ConnectionCount( const TDesC& aName ) const
- {
- TInt ret = 0;
-
-#ifdef _DEBUG
- RDebug::Print( _L("CMemSpyThreadInfoSession::ConnectionCount() - START - aName: %S"), &aName );
-#endif
-
- // See if we have an entry with that name...
- TIdentityRelation<CSessionInfoEntry> comparer( CompareEntries );
- HBufC* name = aName.AllocLC();
- CSessionInfoEntry* entry = new(ELeave) CSessionInfoEntry( name );
- CleanupStack::Pop( name );
- CleanupStack::PushL( entry );
- const TInt foundIndex = iServerNames.Find( entry, comparer );
- CleanupStack::PopAndDestroy( entry );
-
- // If we did, get the count
- if ( foundIndex >=0 && foundIndex < iServerNames.Count() )
- {
- ret = iServerNames[ foundIndex ]->iCount;
- }
- //
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoSession::ConnectionCount() - END - ret: %d", ret );
-#endif
- //
- return ret;
- }
-
-
-void CMemSpyThreadInfoSession::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& aItem, TInt /*aRefCount*/, TDes& aFullName )
- {
- // Check whether we have the item already?
- TIdentityRelation<CSessionInfoEntry> comparer( CompareEntries );
-
- // Prepare object, just in case we don't find it...
- HBufC* name = aFullName.AllocLC();
-
-#ifdef _DEBUG
- TBuf<KMaxName> origName; origName.Copy( aItem.iName );
- RDebug::Print( _L("CMemSpyThreadInfoSession::HandleContainerItemL() - START - handle: 0x%08x, type: %d, origName: %S, modName: %S"), aItem.iHandle, aItem.iType, &origName, name );
-#else
- (void) aItem;
-#endif
-
- CSessionInfoEntry* entry = new(ELeave) CSessionInfoEntry( name );
- CleanupStack::Pop( name );
- CleanupStack::PushL( entry );
-
- // Search
- const TInt foundIndex = iServerNames.Find( entry, comparer );
- if ( foundIndex == KErrNotFound )
- {
- // Make new entry
- iServerNames.AppendL( entry );
- CleanupStack::Pop( entry );
- }
- else if ( foundIndex >= 0 )
- {
- // Existing entry, increment count
- CleanupStack::PopAndDestroy( entry );
- entry = iServerNames[ foundIndex ];
- ++entry->iCount;
- }
- else
- {
- CleanupStack::PopAndDestroy( entry );
- }
-
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoSession::HandleContainerItemL() - END - foundIndex: %d", foundIndex );
-#endif
- }
-
-
-void CMemSpyThreadInfoSession::HandleAllItemsLocatedL()
- {
- _LIT(KSecondLineFormatStringCount1, "1 connection");
- _LIT(KSecondLineFormatStringCountMoreThanOne, "%d connections");
- TBuf<50> buf;
-
- // All items have been found, now create listbox entries
- const TInt count = iServerNames.Count();
- for( TInt i=0; i<count; i++ )
- {
- CSessionInfoEntry* entry = iServerNames[ i ];
-
- if ( entry->iCount == 1 )
- {
- buf.Copy( KSecondLineFormatStringCount1 );
- }
- else
- {
- buf.Format( KSecondLineFormatStringCountMoreThanOne, entry->iCount );
- }
-
- AddItemL( *entry->iName, buf );
- }
- }
-
-
-TBool CMemSpyThreadInfoSession::CompareEntries( const CSessionInfoEntry& aLeft, const CSessionInfoEntry& aRight )
- {
- return ( aLeft.iName->CompareF( *aRight.iName ) == 0 );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoSemaphore::CMemSpyThreadInfoSemaphore( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleByContainer( aContainer, EMemSpyThreadInfoItemTypeSemaphore, EMemSpyDriverContainerTypeSemaphore, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoSemaphore* CMemSpyThreadInfoSemaphore::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoSemaphore* self = new(ELeave) CMemSpyThreadInfoSemaphore( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoSemaphore::Name() const
- {
- _LIT(KName, "\tSemaphores");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoSemaphore::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& aItem, TInt /*aRefCount*/, TDes& aFullName )
- {
- _LIT( KFormatSpec, "Count: %d" );
- TBuf<50> buf;
- buf.AppendFormat( KFormatSpec, aItem.iCount );
-
- AddItemL( aFullName, buf );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoMutex::CMemSpyThreadInfoMutex( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleByContainer( aContainer, EMemSpyThreadInfoItemTypeMutex, EMemSpyDriverContainerTypeMutex, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoMutex* CMemSpyThreadInfoMutex::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoMutex* self = new(ELeave) CMemSpyThreadInfoMutex( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoMutex::Name() const
- {
- _LIT(KName, "\tMutexes");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoMutex::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& aItem, TInt /*aRefCount*/, TDes& aFullName )
- {
- _LIT( KFormatSpec, "Count: %d" );
- TBuf<50> buf;
- buf.AppendFormat( KFormatSpec, aItem.iCount );
-
- AddItemL( aFullName, buf );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoTimer::CMemSpyThreadInfoTimer( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleByContainer( aContainer, EMemSpyThreadInfoItemTypeTimer, EMemSpyDriverContainerTypeTimer, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoTimer* CMemSpyThreadInfoTimer::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoTimer* self = new(ELeave) CMemSpyThreadInfoTimer( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoTimer::Name() const
- {
- _LIT(KName, "\tTimers");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoTimer::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& aItem, TInt /*aRefCount*/, TDes& /*aFullName*/ )
- {
- // Get useful strings
- TBuf<20> state;
- GetTimerState( aItem.iTimerState, state );
- TBuf<20> type;
- GetTimerType( aItem.iTimerType, type );
-
- AddItemL( type, state );
- }
-
-
-void CMemSpyThreadInfoTimer::GetTimerState( TMemSpyDriverTimerState aState, TDes& aBuf )
- {
- switch( aState )
- {
- default:
- case EMemSpyDriverTimerStateUnknown:
- {
- _LIT(KStateUnknown, "Unknown");
- aBuf.Copy( KStateUnknown );
- }
- break;
- case EMemSpyDriverTimerStateIdle:
- {
- _LIT(KStateIdle, "Idle");
- aBuf.Copy( KStateIdle );
- }
- break;
- case EMemSpyDriverTimerStateWaiting:
- {
- _LIT(KStateWaiting, "Waiting");
- aBuf.Copy( KStateWaiting );
- }
- break;
- case EMemSpyDriverTimerStateWaitHighRes:
- {
- _LIT(KStateWaitHighRes, "Waiting, High Res.");
- aBuf.Copy( KStateWaitHighRes );
- }
- break;
- }
- }
-
-
-void CMemSpyThreadInfoTimer::GetTimerType( TMemSpyDriverTimerType aType, TDes& aBuf )
- {
- switch( aType )
- {
- case EMemSpyDriverTimerTypeRelative:
- {
- _LIT( KType, "Relative" );
- aBuf.Copy( KType );
- }
- break;
- case EMemSpyDriverTimerTypeAbsolute:
- {
- _LIT( KType, "Absolute" );
- aBuf.Copy( KType );
- }
- break;
- case EMemSpyDriverTimerTypeHighRes:
- {
- _LIT( KType, "High Res." );
- aBuf.Copy( KType );
- }
- break;
- case EMemSpyDriverTimerTypeInactivity:
- {
- _LIT( KType, "Inactivity" );
- aBuf.Copy( KType );
- }
- break;
- default:
- {
- _LIT( KType, "Unknown" );
- aBuf.Copy( KType );
- }
- break;
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoLDD::CMemSpyThreadInfoLDD( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleByContainer( aContainer, EMemSpyThreadInfoItemTypeLDD, EMemSpyDriverContainerTypeLogicalDevice, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoLDD* CMemSpyThreadInfoLDD::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoLDD* self = new(ELeave) CMemSpyThreadInfoLDD( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoLDD::Name() const
- {
- _LIT(KName, "\tLogical Device Drivers");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoLDD::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& aItem, TInt /*aRefCount*/, TDes& aFullName )
- {
- _LIT( KFormatSpec, "Open channels: %d" );
- TBuf<50> buf;
- buf.AppendFormat( KFormatSpec, aItem.iOpenChannels );
-
- AddItemL( aFullName, buf );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoPDD::CMemSpyThreadInfoPDD( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleByContainer( aContainer, EMemSpyThreadInfoItemTypePDD, EMemSpyDriverContainerTypePhysicalDevice, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoPDD* CMemSpyThreadInfoPDD::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoPDD* self = new(ELeave) CMemSpyThreadInfoPDD( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoPDD::Name() const
- {
- _LIT(KName, "\tPhysical Device Drivers");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoPDD::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& /*aItem*/, TInt /*aRefCount*/, TDes& aFullName )
- {
- AddItemL( aFullName, KNullDesC );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoLogicalChannel::CMemSpyThreadInfoLogicalChannel( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleByContainer( aContainer, EMemSpyThreadInfoItemTypeLogicalChannel, EMemSpyDriverContainerTypeLogicalChannel, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoLogicalChannel* CMemSpyThreadInfoLogicalChannel::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoLogicalChannel* self = new(ELeave) CMemSpyThreadInfoLogicalChannel( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoLogicalChannel::Name() const
- {
- _LIT(KName, "\tLogical DD Channels");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoLogicalChannel::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& /*aItem*/, TInt /*aRefCount*/, TDes& aFullName )
- {
- AddItemL( aFullName, KNullDesC );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoChangeNotifier::CMemSpyThreadInfoChangeNotifier( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleByContainer( aContainer, EMemSpyThreadInfoItemTypeChangeNotifier, EMemSpyDriverContainerTypeChangeNotifier, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoChangeNotifier* CMemSpyThreadInfoChangeNotifier::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoChangeNotifier* self = new(ELeave) CMemSpyThreadInfoChangeNotifier( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoChangeNotifier::Name() const
- {
- _LIT(KName, "\tChange Notifiers");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoChangeNotifier::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& /*aItem*/, TInt /*aRefCount*/, TDes& aFullName )
- {
- AddItemL( aFullName, KNullDesC );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoUndertaker::CMemSpyThreadInfoUndertaker( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleByContainer( aContainer, EMemSpyThreadInfoItemTypeUndertaker, EMemSpyDriverContainerTypeUndertaker, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoUndertaker* CMemSpyThreadInfoUndertaker::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoUndertaker* self = new(ELeave) CMemSpyThreadInfoUndertaker( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoUndertaker::Name() const
- {
- _LIT(KName, "\tUndertakers");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoUndertaker::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& /*aItem*/, TInt /*aRefCount*/, TDes& aFullName )
- {
- AddItemL( aFullName, KNullDesC );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoOwnedThreadHandles::CMemSpyThreadInfoOwnedThreadHandles( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleByContainer( aContainer, EMemSpyThreadInfoItemTypeOwnedThreadHandles, EMemSpyDriverContainerTypeThread, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoOwnedThreadHandles* CMemSpyThreadInfoOwnedThreadHandles::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoOwnedThreadHandles* self = new(ELeave) CMemSpyThreadInfoOwnedThreadHandles( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoOwnedThreadHandles::Name() const
- {
- _LIT(KName, "\tHandles to other\nThreads");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoOwnedThreadHandles::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& aItem, TInt aRefCount, TDes& aFullName )
- {
- const TInt bracketPosStart = aFullName.LocateF( TChar('[') );
- const TInt doubleColonPos = aFullName.FindF( _L("::" ) );
- //
- if ( bracketPosStart >= 0 && doubleColonPos > bracketPosStart && doubleColonPos < aFullName.Length() - 2 )
- {
- // Process
- TPtrC pProcessName( aFullName.Left( bracketPosStart ) );
- HBufC* caption = HBufC::NewLC( KMaxName + 10 );
- TPtr pCaption( caption->Des() );
- pCaption.AppendFormat( _L("[%2d] %S"), aRefCount, &pProcessName );
-
- // Thread id & thread name
- TPtrC pThreadName( aFullName.Mid( doubleColonPos + 2 ) );
- HBufC* value = HBufC::NewLC( KMaxName + 10 );
- TPtr pValue( value->Des() );
- pValue.AppendFormat( _L("[%3d] %S"), aItem.iId, &pThreadName );
-
- // Add it & tidy up
- AddItemL( pCaption, pValue );
- CleanupStack::PopAndDestroy( 2, caption );
- }
- else
- {
- AddItemL( aFullName, KNullDesC );
- }
- }
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoOwnedProcessHandles::CMemSpyThreadInfoOwnedProcessHandles( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleByContainer( aContainer, EMemSpyThreadInfoItemTypeOwnedProcessHandles, EMemSpyDriverContainerTypeProcess, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoOwnedProcessHandles* CMemSpyThreadInfoOwnedProcessHandles::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoOwnedProcessHandles* self = new(ELeave) CMemSpyThreadInfoOwnedProcessHandles( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoOwnedProcessHandles::Name() const
- {
- _LIT(KName, "\tHandles to other\nProcesses");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoOwnedProcessHandles::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& aItem, TInt aRefCount, TDes& aFullName )
- {
- const TInt bracketPosStart = aFullName.LocateF( TChar('[') );
- const TInt doubleColonPos = aFullName.FindF( _L("::" ) );
- //
- if ( bracketPosStart >= 0 && doubleColonPos > bracketPosStart && doubleColonPos < aFullName.Length() - 2 )
- {
- // Process
- TPtrC pProcessName( aFullName.Left( bracketPosStart ) );
- HBufC* caption = HBufC::NewLC( KMaxName + 10 );
- TPtr pCaption( caption->Des() );
- pCaption.AppendFormat( _L("[%2d] %S"), aRefCount, &pProcessName );
-
- // Thread id & thread name
- TPtrC pThreadName( aFullName.Mid( doubleColonPos + 2 ) );
- HBufC* value = HBufC::NewLC( KMaxName + 10 );
- TPtr pValue( value->Des() );
- pValue.AppendFormat( _L("[%3d] %S"), aItem.iId, &pThreadName );
-
- // Add it & tidy up
- AddItemL( pCaption, pValue );
- CleanupStack::PopAndDestroy( 2, caption );
- }
- else
- {
- AddItemL( aFullName, KNullDesC );
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoReferencedBy::CMemSpyThreadInfoReferencedBy( CMemSpyThreadInfoContainer& aContainer, TMemSpyThreadInfoItemType aItemType, TMemSpyDriverContainerType aContainerType, TBool aAsyncConstruction )
-: CMemSpyThreadInfoHandleObjectBase( aContainer, aItemType, aContainerType, aAsyncConstruction )
- {
- }
-
-
-void CMemSpyThreadInfoReferencedBy::GetHandlesL( RArray<THandleWrapper>& aArray )
- {
- aArray.Reset();
- //
- TInt r = KErrNone;
- //
- CMemSpyProcess& process = Container().Thread().Process();
- CMemSpyEngine& engine = process.Engine();
- TIdentityRelation<CMemSpyThreadInfoHandleObjectBase::THandleWrapper> finder( THandleWrapper::Match );
-
- // We need to either search through:
- //
- // a) all thread & process handles looking for *this thread*, or
- // b) all thread & process handles looking for *this process*
- //
- // We abuse the "container type" as a means of deciding whether it is
- // the thread or the process we are looking for.
- //
- RMemSpyDriverClient& driver = engine.Driver();
- if ( ContainerType() == EMemSpyDriverContainerTypeProcess )
- {
- const TUint id = Container().Thread().Process().Id();
- r = driver.GetReferencesToMyProcess( id );
- }
- else if ( ContainerType() == EMemSpyDriverContainerTypeThread )
- {
- const TUint id = Container().Thread().Id();
- r = driver.GetReferencesToMyThread( id );
- }
- else
- {
- ASSERT( EFalse );
- }
- User::LeaveIfError( r );
-
- RMemSpyMemStreamReader stream = driver.StreamOpenL();
- CleanupClosePushL( stream );
-
- // Extract thread matches
- const TInt threadCount = stream.ReadInt32L();
- for( TInt i=0; i<threadCount; i++ )
- {
- TAny* handle = (TAny*) stream.ReadUint32L();
-
- // Create temporary entry that we'll use as the key in our array...
- CMemSpyThreadInfoHandleObjectBase::THandleWrapper entry( handle, EMemSpyDriverContainerTypeThread );
-
- // Find existing duplicate entry (if there is one...)
- const TInt errorOrIndex = aArray.Find( entry, finder );
-
- if ( errorOrIndex == KErrNotFound )
- {
- // Not a duplicate handle, so keep it
- aArray.AppendL( entry );
- }
- else if ( errorOrIndex >= 0 )
- {
- // Increment reference count for duplicates...
- CMemSpyThreadInfoHandleObjectBase::THandleWrapper& existingEntry = aArray[ errorOrIndex ];
- ++existingEntry.iRefCount;
- }
- }
-
- // Extract process matches
- const TInt processCount = stream.ReadInt32L();
- for( TInt i=0; i<processCount; i++ )
- {
- TAny* handle = (TAny*) stream.ReadUint32L();
-
- // Create temporary entry that we'll use as the key in our array...
- CMemSpyThreadInfoHandleObjectBase::THandleWrapper entry( handle, EMemSpyDriverContainerTypeProcess );
-
- // Find existing duplicate entry (if there is one...)
- const TInt errorOrIndex = aArray.Find( entry, finder );
-
- if ( errorOrIndex == KErrNotFound )
- {
- // Not a duplicate handle, so keep it
- aArray.AppendL( entry );
- }
- else if ( errorOrIndex >= 0 )
- {
- // Increment reference count for duplicates...
- CMemSpyThreadInfoHandleObjectBase::THandleWrapper& existingEntry = aArray[ errorOrIndex ];
- ++existingEntry.iRefCount;
- }
- }
-
- // Tidy up
- CleanupStack::PopAndDestroy( &stream );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoOtherThreads::CMemSpyThreadInfoOtherThreads( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoReferencedBy( aContainer, EMemSpyThreadInfoItemTypeOtherThreads, EMemSpyDriverContainerTypeThread, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoOtherThreads* CMemSpyThreadInfoOtherThreads::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoOtherThreads* self = new(ELeave) CMemSpyThreadInfoOtherThreads( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoOtherThreads::Name() const
- {
- _LIT(KName, "\tReferences this Thread");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoOtherThreads::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& /*aItem*/, TInt /*aRefCount*/, TDes& aFullName )
- {
- AddItemL( aFullName, KNullDesC );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoOtherProcesses::CMemSpyThreadInfoOtherProcesses( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoReferencedBy( aContainer, EMemSpyThreadInfoItemTypeOtherProcesses, EMemSpyDriverContainerTypeProcess, aAsyncConstruction )
- {
- }
-
-
-CMemSpyThreadInfoOtherProcesses* CMemSpyThreadInfoOtherProcesses::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoOtherProcesses* self = new(ELeave) CMemSpyThreadInfoOtherProcesses( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoOtherProcesses::Name() const
- {
- _LIT(KName, "\tReferences this Process");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoOtherProcesses::HandleContainerItemL( TMemSpyDriverHandleInfoGeneric& /*aItem*/, TInt /*aRefCount*/, TDes& aFullName )
- {
- AddItemL( aFullName, KNullDesC );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoMemoryTracking::CMemSpyThreadInfoMemoryTracking( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoItemBase( aContainer, EMemSpyThreadInfoItemTypeMemoryTracking, aAsyncConstruction ), iTotalIncludesSharedMemory( ETrue )
- {
- }
-
-
-CMemSpyThreadInfoMemoryTracking::~CMemSpyThreadInfoMemoryTracking()
- {
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::~CMemSpyThreadInfoMemoryTracking() - START - this: 0x%08x, iTracker: 0x%08x", this, iTracker );
-#endif
- //
- TrackingObserverRemove( *this );
- //
- delete iInfoHWM;
- delete iInfoPeak;
- delete iInfoCurrent;
- //
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::~CMemSpyThreadInfoMemoryTracking() - END - this: 0x%08x, iTracker: 0x%08x", this, iTracker );
-#endif
- }
-
-
-void CMemSpyThreadInfoMemoryTracking::ConstructL()
- {
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::ConstructL() - START - this: 0x%08x, iTracker: 0x%08x", this, iTracker );
-#endif
- CMemSpyEngine& engine = Container().Thread().Process().Engine();
- //
- const TProcessId pid = Container().Thread().Process().Id();
- iTracker = engine.HelperProcess().TrackerOrNull( pid );
-
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::ConstructL() - requesting observer add... - this: 0x%08x, iTracker: 0x%08x", this, iTracker );
-#endif
- TrackingObserverAddL( *this );
- //
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::ConstructL() - preparing info item... - this: 0x%08x, iTracker: 0x%08x", this, iTracker );
-#endif
- if ( iTracker )
- {
- delete iInfoCurrent;
- iInfoCurrent = NULL;
- iInfoCurrent = CMemSpyThreadInfoMemoryTrackingStatisticsCurrent::NewLC( Container(), EFalse );
- CleanupStack::Pop( iInfoCurrent );
- //
- delete iInfoHWM;
- iInfoHWM = NULL;
- iInfoHWM = CMemSpyThreadInfoMemoryTrackingStatisticsHWM::NewLC( Container(), EFalse );
- CleanupStack::Pop( iInfoHWM );
- //
- delete iInfoPeak;
- iInfoPeak = NULL;
- iInfoPeak = CMemSpyThreadInfoMemoryTrackingStatisticsPeak::NewLC( Container(), EFalse );
- CleanupStack::Pop( iInfoPeak );
- }
-
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::ConstructL() - prepared info items - this: 0x%08x, iTracker: 0x%08x", this, iTracker );
-#endif
-
- // Prepare items
- _LIT( KItem0, "Tracking" );
- AddItemOnOffL( KItem0, ( iTracker ) ? iTracker->AmTracking() : EFalse );
-
- TInt64 valCurrent( 0 );
- if ( iTracker )
- {
- if ( TotalIncludesSharedMemory() )
- {
- valCurrent = iTracker->InfoCurrent().TotalIncShared();
- }
- else
- {
- valCurrent = iTracker->InfoCurrent().TotalExcShared();
- }
- }
- _LIT( KItem1, "Total [Current]" );
- AddItemLongL( KItem1, valCurrent );
-
- TInt64 valHWM( 0 );
- if ( iTracker )
- {
- if ( TotalIncludesSharedMemory() )
- {
- valHWM = iTracker->InfoHWMIncShared().TotalIncShared();
- }
- else
- {
- valHWM = iTracker->InfoHWMExcShared().TotalExcShared();
- }
- }
- _LIT( KItem2, "Total [HWM]" );
- AddItemLongL( KItem2, valHWM );
-
- TInt64 valPeak( 0 );
- if ( iTracker )
- {
- if ( TotalIncludesSharedMemory() )
- {
- valPeak = iTracker->InfoPeaks().TotalIncShared();
- }
- else
- {
- valPeak = iTracker->InfoPeaks().TotalExcShared();
- }
- }
- _LIT( KItem3, "Total [Peaks]" );
- AddItemLongL( KItem3, valPeak );
-
- //
- Container().NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemChanged, Type() );
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::ConstructL() - END - this: 0x%08x", this );
-#endif
- }
-
-
-CMemSpyThreadInfoMemoryTracking* CMemSpyThreadInfoMemoryTracking::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoMemoryTracking* self = new(ELeave) CMemSpyThreadInfoMemoryTracking( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-EXPORT_C TPtrC CMemSpyThreadInfoMemoryTracking::Name() const
- {
- _LIT(KName, "\tMemory Tracking");
- return TPtrC( KName );
- }
-
-
-EXPORT_C TBool CMemSpyThreadInfoMemoryTracking::TrackingActive() const
- {
- return ( iTracker != NULL ? iTracker->AmTracking() : EFalse );
- }
-
-
-EXPORT_C TBool CMemSpyThreadInfoMemoryTracking::TotalIncludesSharedMemory() const
- {
- return iTotalIncludesSharedMemory;
- }
-
-
-EXPORT_C void CMemSpyThreadInfoMemoryTracking::TrackingSetTotalIncludesSharedMemoryL( TBool aIncludesSharedMemory )
- {
- iTotalIncludesSharedMemory = aIncludesSharedMemory;
-
- if ( iTracker )
- {
- iInfoCurrent->SetTotalIncludesSharedMemoryL( aIncludesSharedMemory );
- iInfoHWM->SetTotalIncludesSharedMemoryL( aIncludesSharedMemory );
- iInfoPeak->SetTotalIncludesSharedMemoryL( aIncludesSharedMemory );
-
- // Update totals
- TRAP_IGNORE( UpdateCaptionsL( iTracker->InfoCurrent(), iTracker->InfoHWMIncShared(), iTracker->InfoHWMExcShared() ) );
- }
- }
-
-
-EXPORT_C void CMemSpyThreadInfoMemoryTracking::TrackingStartL()
- {
- if ( iTracker == NULL )
- {
- CMemSpyProcess& process = Container().Thread().Process();
- CMemSpyEngine& engine = process.Engine();
- iTracker = &engine.HelperProcess().TrackerL( process );
-
- // Make sure we are also listening to the tracker!
- TrackingObserverAddL( *this );
- //
- CMemSpyThreadInfoMemoryTrackingStatisticsCurrent* infoCurrent = CMemSpyThreadInfoMemoryTrackingStatisticsCurrent::NewLC( Container(), EFalse );
- CMemSpyThreadInfoMemoryTrackingStatisticsHWM* infoHWM = CMemSpyThreadInfoMemoryTrackingStatisticsHWM::NewLC( Container(), EFalse );
- CMemSpyThreadInfoMemoryTrackingStatisticsPeak* infoPeak = CMemSpyThreadInfoMemoryTrackingStatisticsPeak::NewLC( Container(), EFalse );
- //
- iInfoCurrent = infoCurrent;
- iInfoHWM = infoHWM;
- iInfoPeak = infoPeak;
- //
- CleanupStack::Pop( iInfoPeak );
- CleanupStack::Pop( infoHWM );
- CleanupStack::Pop( infoCurrent );
- //
- TrackingSetTotalIncludesSharedMemoryL( iTotalIncludesSharedMemory );
- }
-
- iTracker->StartL();
-
- UpdateCaptionsL();
- }
-
-
-EXPORT_C void CMemSpyThreadInfoMemoryTracking::TrackingStopL()
- {
- if ( iTracker != NULL )
- {
- iTracker->Stop();
- }
-
- UpdateCaptionsL();
- }
-
-
-EXPORT_C void CMemSpyThreadInfoMemoryTracking::TrackingResetHWML()
- {
- if ( iTracker != NULL )
- {
- iTracker->ResetHWML();
- }
- }
-
-
-EXPORT_C void CMemSpyThreadInfoMemoryTracking::TrackingObserverAddL( MMemSpyEngineProcessMemoryTrackerObserver& aObserver )
- {
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::TrackingObserverAddL() - START - iTracker: 0x%08x, this: 0x%08x", iTracker, this );
-#endif
-
- if ( iTracker != NULL )
- {
- iTracker->AddObserverL( aObserver );
- }
-
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::TrackingObserverAddL() - END - iTracker: 0x%08x, this: 0x%08x", iTracker, this );
-#endif
- }
-
-
-EXPORT_C void CMemSpyThreadInfoMemoryTracking::TrackingObserverRemove( MMemSpyEngineProcessMemoryTrackerObserver& aObserver )
- {
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::TrackingObserverRemove() - START - iTracker: 0x%08x, this: 0x%08x", iTracker, this );
-#endif
-
- if ( iTracker != NULL )
- {
- iTracker->RemoveObserver( aObserver );
- }
-
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::TrackingObserverRemove() - END - iTracker: 0x%08x, this: 0x%08x", iTracker, this );
-#endif
- }
-
-
-EXPORT_C MDesCArray& CMemSpyThreadInfoMemoryTracking::InfoCurrent()
- {
- return *iInfoCurrent;
- }
-
-
-EXPORT_C MDesCArray& CMemSpyThreadInfoMemoryTracking::InfoHWM()
- {
- return *iInfoHWM;
- }
-
-
-EXPORT_C MDesCArray& CMemSpyThreadInfoMemoryTracking::InfoPeak()
- {
- return *iInfoPeak;
- }
-
-
-void CMemSpyThreadInfoMemoryTracking::HandleMemoryTrackingStartedL()
- {
- __ASSERT_ALWAYS( iTracker, MemSpyEngineUtils::Panic( EMemSpyEnginePanicTrackerNull1 ) );
- CMemSpyThreadInfoItemBase::CItem& trackingItem = Item( 0 );
- trackingItem.SetOnOffL( iTracker->AmTracking() );
- //
- Container().NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemChanged, Type() );
- }
-
-
-void CMemSpyThreadInfoMemoryTracking::HandleMemoryTrackingStoppedL()
- {
- __ASSERT_ALWAYS( iTracker, MemSpyEngineUtils::Panic( EMemSpyEnginePanicTrackerNull2 ) );
- CMemSpyThreadInfoItemBase::CItem& trackingItem = Item( 0 );
- trackingItem.SetOnOffL( iTracker->AmTracking() );
- //
- Container().NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemChanged, Type() );
- }
-
-
-void CMemSpyThreadInfoMemoryTracking::HandleMemoryChangedL( const TProcessId& /*aPid*/, const TMemSpyDriverProcessInspectionInfo& aInfoCurrent, const TMemSpyDriverProcessInspectionInfo& aHWMInfoIncShared, const TMemSpyDriverProcessInspectionInfo& aHWMInfoExcShared )
- {
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::HandleMemoryChangedL() - START - this: 0x%08x", this );
-#endif
-
- __ASSERT_ALWAYS( iTracker, MemSpyEngineUtils::Panic( EMemSpyEnginePanicTrackerNull3 ) );
- UpdateCaptionsL( aInfoCurrent, aHWMInfoIncShared, aHWMInfoExcShared );
-
-#ifdef _DEBUG
- RDebug::Printf( "CMemSpyThreadInfoMemoryTracking::HandleMemoryChangedL() - END - this: 0x%08x", this );
-#endif
- }
-
-
-void CMemSpyThreadInfoMemoryTracking::UpdateCaptionsL()
- {
- if ( iTracker )
- {
- UpdateCaptionsL( iTracker->InfoCurrent(), iTracker->InfoHWMIncShared(), iTracker->InfoHWMExcShared() );
- }
- }
-
-
-void CMemSpyThreadInfoMemoryTracking::UpdateCaptionsL( const TMemSpyDriverProcessInspectionInfo& aInfoCurrent, const TMemSpyDriverProcessInspectionInfo& aHWMInfoIncShared, const TMemSpyDriverProcessInspectionInfo& aHWMInfoExcShared )
- {
- if ( iTracker )
- {
- // Update caption
- Item( 0 ).SetOnOffL( TrackingActive() );
-
- if ( TotalIncludesSharedMemory() )
- {
- Item( 1 ).SetLongL( aInfoCurrent.TotalIncShared() );
- Item( 2 ).SetLongL( aHWMInfoIncShared.TotalIncShared() );
- Item( 3 ).SetLongL( iTracker->InfoPeaks().TotalIncShared() );
- }
- else
- {
- Item( 1 ).SetLongL( aInfoCurrent.TotalExcShared() );
- Item( 2 ).SetLongL( aHWMInfoExcShared.TotalExcShared() );
- Item( 3 ).SetLongL( iTracker->InfoPeaks().TotalExcShared() );
- }
-
- Container().NotifyObserverL( MMemSpyThreadInfoContainerObserver::EInfoItemChanged, Type() );
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoMemoryTrackingStatisticsCurrent::CMemSpyThreadInfoMemoryTrackingStatisticsCurrent( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoItemBase( aContainer, EMemSpyThreadInfoItemTypeMemoryTrackingCurrent, aAsyncConstruction ), iTotalIncludesSharedMemory( ETrue )
- {
- }
-
-
-CMemSpyThreadInfoMemoryTrackingStatisticsCurrent::~CMemSpyThreadInfoMemoryTrackingStatisticsCurrent()
- {
- if ( iTracker )
- {
- iTracker->RemoveObserver( *this );
- }
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsCurrent::ConstructL()
- {
- CMemSpyEngine& engine = Container().Thread().Process().Engine();
- //
- if ( iTracker )
- {
- iTracker->RemoveObserver( *this );
- }
- iTracker = &Container().Engine().HelperProcess().TrackerL( Container().Thread().Process() );
- if ( iTracker )
- {
- iTracker->AddObserverL( *this );
- //
- _LIT( KItem1, "Stack Memory" );
- AddItemDecimalL( KItem1, iTracker->InfoCurrent().iMemoryStack );
- //
- _LIT( KItem2, "Heap Memory" );
- AddItemDecimalL( KItem2, iTracker->InfoCurrent().iMemoryHeap );
- //
- _LIT( KItem3, "Local Chunk Memory" );
- AddItemDecimalL( KItem3, iTracker->InfoCurrent().iMemoryChunkLocal );
- //
- _LIT( KItem4, "Shared Chunk Memory" );
- AddItemDecimalL( KItem4, iTracker->InfoCurrent().iMemoryChunkShared );
- //
- _LIT( KItem5, "Global Data Memory" );
- AddItemDecimalL( KItem5, iTracker->InfoCurrent().iMemoryGlobalData );
- //
- _LIT( KItem6, "Total" );
- if ( iTotalIncludesSharedMemory )
- {
- AddItemLongL( KItem6, iTracker->InfoCurrent().TotalIncShared() );
- }
- else
- {
- AddItemLongL( KItem6, iTracker->InfoCurrent().TotalExcShared() );
- }
- }
- }
-
-
-CMemSpyThreadInfoMemoryTrackingStatisticsCurrent* CMemSpyThreadInfoMemoryTrackingStatisticsCurrent::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoMemoryTrackingStatisticsCurrent* self = new(ELeave) CMemSpyThreadInfoMemoryTrackingStatisticsCurrent( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-TPtrC CMemSpyThreadInfoMemoryTrackingStatisticsCurrent::Name() const
- {
- _LIT(KName, "\tCurrent Statistics");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsCurrent::SetTotalIncludesSharedMemoryL( TBool aIncludesSharedMemory )
- {
- iTotalIncludesSharedMemory = aIncludesSharedMemory;
-
- // Update totals
- HandleMemoryChangedL( iTracker->ProcessId(), iTracker->InfoCurrent(), iTracker->InfoHWMIncShared(), iTracker->InfoHWMExcShared() );
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsCurrent::HandleMemoryTrackingStartedL()
- {
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsCurrent::HandleMemoryTrackingStoppedL()
- {
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsCurrent::HandleMemoryChangedL( const TProcessId& /*aPid*/, const TMemSpyDriverProcessInspectionInfo& aInfoCurrent, const TMemSpyDriverProcessInspectionInfo& /*aHWMInfoIncShared*/, const TMemSpyDriverProcessInspectionInfo& /*aHWMInfoExcShared*/ )
- {
- Item( 0 ).SetDecimalL( aInfoCurrent.iMemoryStack );
- Item( 1 ).SetDecimalL( aInfoCurrent.iMemoryHeap );
- Item( 2 ).SetDecimalL( aInfoCurrent.iMemoryChunkLocal );
- Item( 3 ).SetDecimalL( aInfoCurrent.iMemoryChunkShared );
- Item( 4 ).SetDecimalL( aInfoCurrent.iMemoryGlobalData );
- //
- if ( iTotalIncludesSharedMemory )
- {
- Item( 5 ).SetLongL( aInfoCurrent.TotalIncShared() );
- }
- else
- {
- Item( 5 ).SetLongL( aInfoCurrent.TotalExcShared() );
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoMemoryTrackingStatisticsPeak::CMemSpyThreadInfoMemoryTrackingStatisticsPeak( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoItemBase( aContainer, EMemSpyThreadInfoItemTypeMemoryTrackingPeak, aAsyncConstruction ), iTotalIncludesSharedMemory( ETrue )
- {
- }
-
-
-CMemSpyThreadInfoMemoryTrackingStatisticsPeak::~CMemSpyThreadInfoMemoryTrackingStatisticsPeak()
- {
- if ( iTracker )
- {
- iTracker->RemoveObserver( *this );
- }
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsPeak::ConstructL()
- {
- CMemSpyEngine& engine = Container().Thread().Process().Engine();
- //
- if ( iTracker )
- {
- iTracker->RemoveObserver( *this );
- }
- iTracker = &Container().Engine().HelperProcess().TrackerL( Container().Thread().Process() );
- if ( iTracker )
- {
- iTracker->AddObserverL( *this );
- //
- _LIT( KItem1, "Stack Memory" );
- AddItemDecimalL( KItem1, iTracker->InfoPeaks().iMemoryStack );
- //
- _LIT( KItem2, "Heap Memory" );
- AddItemDecimalL( KItem2, iTracker->InfoPeaks().iMemoryHeap );
- //
- _LIT( KItem3, "Local Chunk Memory" );
- AddItemDecimalL( KItem3, iTracker->InfoPeaks().iMemoryChunkLocal );
- //
- _LIT( KItem4, "Shared Chunk Memory" );
- AddItemDecimalL( KItem4, iTracker->InfoPeaks().iMemoryChunkShared );
- //
- _LIT( KItem5, "Global Data Memory" );
- AddItemDecimalL( KItem5, iTracker->InfoPeaks().iMemoryGlobalData );
- //
- _LIT( KItem6, "Total" );
- if ( iTotalIncludesSharedMemory )
- {
- AddItemLongL( KItem6, iTracker->InfoPeaks().TotalIncShared() );
- }
- else
- {
- AddItemLongL( KItem6, iTracker->InfoPeaks().TotalExcShared() );
- }
- }
- }
-
-
-CMemSpyThreadInfoMemoryTrackingStatisticsPeak* CMemSpyThreadInfoMemoryTrackingStatisticsPeak::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoMemoryTrackingStatisticsPeak* self = new(ELeave) CMemSpyThreadInfoMemoryTrackingStatisticsPeak( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-TPtrC CMemSpyThreadInfoMemoryTrackingStatisticsPeak::Name() const
- {
- _LIT(KName, "\tPeak Statistics");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsPeak::SetTotalIncludesSharedMemoryL( TBool aIncludesSharedMemory )
- {
- iTotalIncludesSharedMemory = aIncludesSharedMemory;
-
- // Update totals
- HandleMemoryChangedL( iTracker->ProcessId(), iTracker->InfoCurrent(), iTracker->InfoHWMIncShared(), iTracker->InfoHWMExcShared() );
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsPeak::HandleMemoryTrackingStartedL()
- {
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsPeak::HandleMemoryTrackingStoppedL()
- {
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsPeak::HandleMemoryChangedL( const TProcessId& /*aPid*/, const TMemSpyDriverProcessInspectionInfo& /*aInfoCurrent*/, const TMemSpyDriverProcessInspectionInfo& /*aHWMInfoIncShared*/, const TMemSpyDriverProcessInspectionInfo& /*aHWMInfoExcShared*/ )
- {
- Item( 0 ).SetDecimalL( iTracker->InfoPeaks().iMemoryStack );
- Item( 1 ).SetDecimalL( iTracker->InfoPeaks().iMemoryHeap );
- Item( 2 ).SetDecimalL( iTracker->InfoPeaks().iMemoryChunkLocal );
- Item( 3 ).SetDecimalL( iTracker->InfoPeaks().iMemoryChunkShared );
- Item( 4 ).SetDecimalL( iTracker->InfoPeaks().iMemoryGlobalData );
- //
- if ( iTotalIncludesSharedMemory )
- {
- Item( 5 ).SetLongL( iTracker->InfoPeaks().TotalIncShared() );
- }
- else
- {
- Item( 5 ).SetLongL( iTracker->InfoPeaks().TotalExcShared() );
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-CMemSpyThreadInfoMemoryTrackingStatisticsHWM::CMemSpyThreadInfoMemoryTrackingStatisticsHWM( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
-: CMemSpyThreadInfoItemBase( aContainer, EMemSpyThreadInfoItemTypeMemoryTrackingHWM, aAsyncConstruction ), iTotalIncludesSharedMemory( ETrue )
- {
- }
-
-
-CMemSpyThreadInfoMemoryTrackingStatisticsHWM::~CMemSpyThreadInfoMemoryTrackingStatisticsHWM()
- {
- if ( iTracker )
- {
- iTracker->RemoveObserver( *this );
- }
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsHWM::ConstructL()
- {
- CMemSpyEngine& engine = Container().Thread().Process().Engine();
- //
- if ( iTracker )
- {
- iTracker->RemoveObserver( *this );
- }
- iTracker = &Container().Engine().HelperProcess().TrackerL( Container().Thread().Process() );
- if ( iTracker )
- {
- iTracker->AddObserverL( *this );
- //
- _LIT( KItem1, "Stack Memory" );
- _LIT( KItem2, "Heap Memory" );
- _LIT( KItem3, "Local Chunk Memory" );
- _LIT( KItem4, "Shared Chunk Memory" );
- _LIT( KItem5, "Global Data Memory" );
- _LIT( KItem6, "Total" );
- //
- if ( iTotalIncludesSharedMemory )
- {
- AddItemDecimalL( KItem1, iTracker->InfoHWMIncShared().iMemoryStack );
- AddItemDecimalL( KItem2, iTracker->InfoHWMIncShared().iMemoryHeap );
- AddItemDecimalL( KItem3, iTracker->InfoHWMIncShared().iMemoryChunkLocal );
- AddItemDecimalL( KItem4, iTracker->InfoHWMIncShared().iMemoryChunkShared );
- AddItemDecimalL( KItem5, iTracker->InfoHWMIncShared().iMemoryGlobalData );
- AddItemLongL( KItem6, iTracker->InfoHWMIncShared().TotalIncShared() );
- }
- else
- {
- AddItemDecimalL( KItem1, iTracker->InfoHWMExcShared().iMemoryStack );
- AddItemDecimalL( KItem2, iTracker->InfoHWMExcShared().iMemoryHeap );
- AddItemDecimalL( KItem3, iTracker->InfoHWMExcShared().iMemoryChunkLocal );
- AddItemDecimalL( KItem4, iTracker->InfoHWMExcShared().iMemoryChunkShared );
- AddItemDecimalL( KItem5, iTracker->InfoHWMExcShared().iMemoryGlobalData );
- AddItemLongL( KItem6, iTracker->InfoHWMExcShared().TotalExcShared() );
- }
- }
- }
-
-
-CMemSpyThreadInfoMemoryTrackingStatisticsHWM* CMemSpyThreadInfoMemoryTrackingStatisticsHWM::NewLC( CMemSpyThreadInfoContainer& aContainer, TBool aAsyncConstruction )
- {
- CMemSpyThreadInfoMemoryTrackingStatisticsHWM* self = new(ELeave) CMemSpyThreadInfoMemoryTrackingStatisticsHWM( aContainer, aAsyncConstruction );
- CleanupStack::PushL( self );
- if ( !aAsyncConstruction )
- {
- self->ConstructL();
- }
- return self;
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsHWM::SetTotalIncludesSharedMemoryL( TBool aIncludesSharedMemory )
- {
- iTotalIncludesSharedMemory = aIncludesSharedMemory;
-
- // Update totals
- HandleMemoryChangedL( iTracker->ProcessId(), iTracker->InfoCurrent(), iTracker->InfoHWMIncShared(), iTracker->InfoHWMExcShared() );
- }
-
-
-TPtrC CMemSpyThreadInfoMemoryTrackingStatisticsHWM::Name() const
- {
- _LIT(KName, "\tHigh-Water-Mark Statistics");
- return TPtrC( KName );
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsHWM::HandleMemoryTrackingStartedL()
- {
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsHWM::HandleMemoryTrackingStoppedL()
- {
- }
-
-
-void CMemSpyThreadInfoMemoryTrackingStatisticsHWM::HandleMemoryChangedL( const TProcessId& /*aPid*/, const TMemSpyDriverProcessInspectionInfo& /*aInfoCurrent*/, const TMemSpyDriverProcessInspectionInfo& aHWMInfoIncShared, const TMemSpyDriverProcessInspectionInfo& aHWMInfoExcShared )
- {
- if ( iTotalIncludesSharedMemory )
- {
- Item( 0 ).SetDecimalL( aHWMInfoIncShared.iMemoryStack );
- Item( 1 ).SetDecimalL( aHWMInfoIncShared.iMemoryHeap );
- Item( 2 ).SetDecimalL( aHWMInfoIncShared.iMemoryChunkLocal );
- Item( 3 ).SetDecimalL( aHWMInfoIncShared.iMemoryChunkShared );
- Item( 4 ).SetDecimalL( aHWMInfoIncShared.iMemoryGlobalData );
- Item( 5 ).SetLongL( aHWMInfoIncShared.TotalIncShared() );
- }
- else
- {
- Item( 0 ).SetDecimalL( aHWMInfoExcShared.iMemoryStack );
- Item( 1 ).SetDecimalL( aHWMInfoExcShared.iMemoryHeap );
- Item( 2 ).SetDecimalL( aHWMInfoExcShared.iMemoryChunkLocal );
- Item( 3 ).SetDecimalL( aHWMInfoExcShared.iMemoryChunkShared );
- Item( 4 ).SetDecimalL( aHWMInfoExcShared.iMemoryGlobalData );
- Item( 5 ).SetLongL( aHWMInfoExcShared.TotalExcShared() );
- }
- }