diff -r 185201be11b0 -r 516af714ebb4 perfsrv/memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTrackerEntryManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/perfsrv/memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTrackerEntryManager.cpp Fri Sep 17 08:38:31 2010 +0300 @@ -0,0 +1,1150 @@ +/* +* 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 "MemSpyEngineHelperSysMemTrackerEntryManager.h" + +// System includes +#include + +// Driver includes +#include + +// User includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "MemSpyEngineHelperSysMemTrackerImp.h" +#include "MemSpyEngineHelperSysMemTrackerLog.h" +#include +#include +#include "MemSpyEngineHelperSysMemTrackerEntries.h" +#include "MemSpyEngineHelperSysMemTrackerEntryChunk.h" +#include "MemSpyEngineHelperSysMemTrackerEntryGlobalData.h" +#include "MemSpyEngineHelperSysMemTrackerEntryHeap.h" +#include "MemSpyEngineHelperSysMemTrackerEntryRamDrive.h" +#include "MemSpyEngineHelperSysMemTrackerEntryStack.h" +#include "MemSpyEngineHelperSysMemTrackerEntryCode.h" +#include "MemSpyEngineHelperSysMemTrackerEntryHandleGeneric.h" +#include "MemSpyEngineHelperSysMemTrackerEntryHandlePAndS.h" +#include "MemSpyEngineHelperSysMemTrackerEntryOpenFile.h" +#include "MemSpyEngineHelperSysMemTrackerEntryDiskSpace.h" +#include "MemSpyEngineHelperSysMemTrackerEntryBitmap.h" +#include "MemSpyEngineHelperSysMemTrackerEntryFbserv.h" +#include "MemSpyEngineHelperSysMemTrackerEntryFileServerCache.h" +#include "MemSpyEngineHelperSysMemTrackerEntrySystemMemory.h" +#include "MemSpyEngineHelperSysMemTrackerEntryWindowServer.h" + + +// Constants + +// Message printed to RDebug output for some clients that may be reading traces +_LIT( KMemSpyKeepaliveMessage, "" ); + + +CMemSpyEngineHelperSysMemTrackerEntryManager::CMemSpyEngineHelperSysMemTrackerEntryManager( CMemSpyEngineHelperSysMemTrackerImp& aTracker, CMemSpyEngineHelperSysMemTrackerEntryManager* aMasterList ) +: iTracker( aTracker ), iMasterList( aMasterList ) + { + } + + +CMemSpyEngineHelperSysMemTrackerEntryManager::~CMemSpyEngineHelperSysMemTrackerEntryManager() + { + iEntries.ResetAndDestroy(); + iEntries.Close(); + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::ConstructL() + { + CreateSeedItemsL(); + } + + +CMemSpyEngineHelperSysMemTrackerEntryManager* CMemSpyEngineHelperSysMemTrackerEntryManager::NewL( CMemSpyEngineHelperSysMemTrackerImp& aTracker ) + { + CMemSpyEngineHelperSysMemTrackerEntryManager* self = new(ELeave) CMemSpyEngineHelperSysMemTrackerEntryManager( aTracker ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +CMemSpyEngineHelperSysMemTrackerEntryManager* CMemSpyEngineHelperSysMemTrackerEntryManager::NewL( CMemSpyEngineHelperSysMemTrackerImp& aTracker, CMemSpyEngineHelperSysMemTrackerEntryManager& aMasterList ) + { + CMemSpyEngineHelperSysMemTrackerEntryManager* self = new(ELeave) CMemSpyEngineHelperSysMemTrackerEntryManager( aTracker, &aMasterList ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::IdentifyChangesL( CMemSpyEngineHelperSysMemTrackerCycle& aCycle ) + { + // Mark everything in this list (i.e. the master list) as dead. + MarkEverythingDead(); + + // Create a new list which will act as a secondary list. This new list will only contain + // new entries. Any entries which it attempts to create that already exist in the master list + // will be discared (after updating the corresponding master list entry with new values). + CMemSpyEngineHelperSysMemTrackerEntryManager* newEM = CMemSpyEngineHelperSysMemTrackerEntryManager::NewL( iTracker, *this ); + CleanupStack::PushL( newEM ); + + // At this point, we have performed several key operations + // + // 1) We have tagged everything that is still alive as "alive". + // 2) We have left everything that no longer exists as "dead" + // 3) We have updated all alive entries with new values (if they have changed) + // 4) We have identified new entries (these are currently orphaned within the secondary list right now). + // + // We now need to merge the two lists, i.e. take all the new entries in 'newEM' and merge them + // into the current master list. + MergeListIntoMeL( *newEM ); + + // We can throw the other list away now as it will be empty. + CleanupStack::PopAndDestroy( newEM ); + + // At this point we have our final new list, but it still contains dead entries. + // We must next output all the change information required for this cycle. + ProcessChangesL( aCycle ); + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::EverythingHasChangedL( CMemSpyEngineHelperSysMemTrackerCycle& aCycle ) + { + ProcessChangesL( aCycle ); + } + + + + + + + + + + + + + + + + + + + + + + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::ProcessChangesL( CMemSpyEngineHelperSysMemTrackerCycle& aCycle ) + { + const TInt count = iEntries.Count(); + for( TInt i=count-1; i>=0; i-- ) + { + CMemSpyEngineHelperSysMemTrackerEntry* entry = iEntries[ i ]; + + // Create any change descriptors etc + TRAP_IGNORE( entry->HandleNewCycleL( aCycle ) ); + + // Destroy the entry if it's no longer needed + if ( entry->IsDead() ) + { + delete entry; + iEntries.Remove( i ); + } + else + { + // It's not new anymore + entry->SetNew( EFalse ); + } + } + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::AddItemAndPopL( CMemSpyEngineHelperSysMemTrackerEntry* aItem ) + { + // We sort by entry key, we do not allow duplicates + TLinearOrder orderer( CompareKey ); + + // Before we save the entry we must check to see if the master list knows about it. + const TUint64 key( aItem->Key() ); + + // Operates in one of two ways. If we're in stand-alone mode, then it saves every specified entry. + // If we're in secondary mode (i.e. we have an associated master list) then it only saves new entries. + // Entries which are changed are updated (in the master list) and entries that don't exist anymore + // are tagged as dead. + // + if ( ActingAsSecondaryList() ) + { + CMemSpyEngineHelperSysMemTrackerEntry* existingEntry = iMasterList->EntryByKey( key ); + if ( existingEntry ) + { + // Entry used to exist, still does. Update the master list entry with the information + // from the transient (new) entry. + existingEntry->UpdateFromL( *aItem ); + + // Entry is still alive. Previously, at the start of the cycle, we'd tagged all master list + // entries as dead, hence we must undo that if we find the entry really still exists... + // NB: this also updates the timestamp for the entry, to show when it was last still alive. + existingEntry->SetAlive(); + + // But it definitely isn't new anymore as we've seen it at least once before + existingEntry->SetNew( EFalse ); + + // Transient entry not needed anymore, keep original + CleanupStack::PopAndDestroy( aItem ); + } + else + { + // Entry didn't exist before - it's a new one + iEntries.InsertInOrderL( aItem, orderer ); + CleanupStack::Pop( aItem ); + } + + // Any entries in the master list which aren't present anymore in this list (aka, dead entries) + // will remain tagged as dead and will be filtered out and dealt with shortly... + } + else + { + // We ARE the master list + const TInt err = iEntries.InsertInOrder( aItem, orderer ); + if ( err == KErrAlreadyExists ) + { + // Don't allow duplicates + RDebug::Printf( "CMemSpyEngineHelperSysMemTrackerEntryManager::AddItemAndPopL() - ******* duplicate key ******* key: %LU, type: %d, tid: 0x%08x, pid: 0x%08x, handle: 0x%08x", key, aItem->Type(), (TUint32) aItem->ThreadId(), (TUint32) aItem->ProcessId(), aItem->Handle() ); + delete aItem; + } + else if ( err != KErrNone ) + { + User::Leave( err ); + } + + CleanupStack::Pop( aItem ); + } + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::MarkEverythingDead() + { + const TInt count = iEntries.Count(); + for( TInt i=count-1; i>=0; i-- ) + { + CMemSpyEngineHelperSysMemTrackerEntry* entry = iEntries[ i ]; + entry->SetDead(); + } + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::MergeListIntoMeL( CMemSpyEngineHelperSysMemTrackerEntryManager& aOtherList ) + { + const TInt count = aOtherList.iEntries.Count(); + for( TInt i=count-1; i>=0; i-- ) + { + CMemSpyEngineHelperSysMemTrackerEntry* entry = aOtherList.iEntries[ i ]; + CleanupStack::PushL( entry ); + aOtherList.iEntries.Remove( i ); + AddItemAndPopL( entry ); + } + } + + +TInt CMemSpyEngineHelperSysMemTrackerEntryManager::FindByHandle( TUint aHandle, TMemSpyEngineSysMemTrackerType aType ) const + { + TInt ret = KErrNotFound; + // + const TInt count = iEntries.Count(); + for( TInt i=0; iHandle() == aHandle && entry->Type() == aType ) + { + ret = i; + break; + } + } + // + return ret; + } + + +TInt CMemSpyEngineHelperSysMemTrackerEntryManager::FindByThreadId( const TThreadId& aThreadId ) const + { + TInt ret = KErrNotFound; + // + const TInt count = iEntries.Count(); + for( TInt i=0; iThreadId() == aThreadId ) + { + ret = i; + break; + } + } + // + return ret; + } + + +CMemSpyEngineHelperSysMemTrackerEntry* CMemSpyEngineHelperSysMemTrackerEntryManager::EntryByKey( const TUint64& aKey ) + { + TLinearOrder orderer( CompareKey ); + // + CMemSpyEngineHelperSysMemTrackerEntryWithSuppliedKey tempEntry( iTracker, aKey ); + const TInt pos = iEntries.FindInOrder( &tempEntry, orderer ); + // + CMemSpyEngineHelperSysMemTrackerEntry* ret = NULL; + if ( pos >= 0 ) + { + ret = iEntries[ pos ]; + } + // + return ret; + } + + +TInt CMemSpyEngineHelperSysMemTrackerEntryManager::CompareKey( const CMemSpyEngineHelperSysMemTrackerEntry& aLeft, const CMemSpyEngineHelperSysMemTrackerEntry& aRight ) + { + TInt ret = -1; + // + const TUint64 kLeft( aLeft.Key() ); + const TUint64 kRight( aRight.Key() ); + // + if ( kLeft > kRight ) + { + ret = 1; + } + else if ( kLeft == kRight ) + { + ret = 0; + } + // + return ret; + } + + +TInt CMemSpyEngineHelperSysMemTrackerEntryManager::CompareKeyAndTimeStamp( const CMemSpyEngineHelperSysMemTrackerEntry& aLeft, const CMemSpyEngineHelperSysMemTrackerEntry& aRight ) + { + TInt ret = CompareKey( aLeft, aRight ); + if ( ret == 0 ) + { + // Keys are the same, so compare time stamps + const TTime& tLeft = aLeft.LastUpdateTime(); + const TTime& tRight = aRight.LastUpdateTime(); + // + ret = -1; + if ( tLeft > tRight ) + { + ret = 1; + } + else if ( tLeft == tRight ) + { + ret = 0; + } + } + // + return ret; + } + + +CMemSpyEngine& CMemSpyEngineHelperSysMemTrackerEntryManager::Engine() + { + return iTracker.Engine(); + } + + + + + + + + + + + + + + + + + + + + + + + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsL() + { + RDebug::Print( KMemSpyKeepaliveMessage ); + + TMemSpyEngineHelperSysMemTrackerConfig config; + Engine().HelperSysMemTracker().GetConfig( config ); + + // Get chunk list for entire device + CMemSpyEngineChunkList* chunks = Engine().HelperChunk().ListL( ); + CleanupStack::PushL( chunks ); + +#ifdef SYSMEMTRACKERLOGGING + { + const TInt chunkCount = chunks->Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = chunks->At( i ).Info(); + RDebug::Print( _L("CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsL() - MASTER - info[%03d]: type: %d, size: %d, name: %S"), i, info.iType, info.iSize, &info.iName ); + } + } +#endif + + if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryFileServerCache ) + { + RDebug::Print( KMemSpyKeepaliveMessage ); + // Extract F32 cache chunk + CreateSeedItemsFileServerCacheL( *chunks ); + } + +#ifdef SYSMEMTRACKERLOGGING + { + const TInt chunkCount = chunks->Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = chunks->At( i ).Info(); + RDebug::Print( _L("CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsL() - AFTER F32 CACHE - info[%03d]: type: %d, size: %d, name: %S"), i, info.iType, info.iSize, &info.iName ); + } + } +#endif + +// TODO: Uncomment when bitmap handels are fixed +// if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryBitmapHandles ) +// { +// RDebug::Print( KMemSpyKeepaliveMessage ); +// // Bitmap +// CreateSeedItemsBitmapL( *chunks ); +// } + +#ifdef SYSMEMTRACKERLOGGING + { + const TInt chunkCount = chunks->Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = chunks->At( i ).Info(); + RDebug::Print( _L("CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsL() - AFTER BITMAPS - info[%03d]: type: %d, size: %d, name: %S"), i, info.iType, info.iSize, &info.iName ); + } + } +#endif + + if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryUserHeap ) + { + RDebug::Print( KMemSpyKeepaliveMessage ); + // Look for user heaps + CreateSeedItemsHeapUserL( *chunks ); + } + +#ifdef SYSMEMTRACKERLOGGING + { + const TInt chunkCount = chunks->Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = chunks->At( i ).Info(); + RDebug::Print( _L("CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsL() - AFTER USER HEAP - info[%03d]: type: %d, size: %d, name: %S"), i, info.iType, info.iSize, &info.iName ); + } + } +#endif + +// TODO: Uncomment after fix +// if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryKernelHeap ) +// { +// RDebug::Print( KMemSpyKeepaliveMessage ); +// // Look for kernel heaps +// CreateSeedItemsHeapKernelL( *chunks ); +// } + +#ifdef SYSMEMTRACKERLOGGING + { + const TInt chunkCount = chunks->Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = chunks->At( i ).Info(); + RDebug::Print( _L("CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsL() - AFTER KERNEL HEAP - info[%03d]: type: %d, size: %d, name: %S"), i, info.iType, info.iSize, &info.iName ); + } + } +#endif + + if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryLocalChunks ) + { + RDebug::Print( KMemSpyKeepaliveMessage ); + // Local chunks + CreateSeedItemsChunkLocalL( *chunks ); + } + +#ifdef SYSMEMTRACKERLOGGING + { + const TInt chunkCount = chunks->Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = chunks->At( i ).Info(); + RDebug::Print( _L("CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsL() - AFTER LOCL CHUNK - info[%03d]: type: %d, size: %d, name: %S"), i, info.iType, info.iSize, &info.iName ); + } + } +#endif + + if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryGlobalChunks ) + { + RDebug::Print( KMemSpyKeepaliveMessage ); + // Global chunks + CreateSeedItemsChunkGlobalL( *chunks ); + } + +#ifdef SYSMEMTRACKERLOGGING + { + const TInt chunkCount = chunks->Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = chunks->At( i ).Info(); + RDebug::Print( _L("CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsL() - AFTER GLOB CHUNK - info[%03d]: type: %d, size: %d, name: %S"), i, info.iType, info.iSize, &info.iName ); + } + } +#endif + + if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryRAMDrive ) + { + RDebug::Print( KMemSpyKeepaliveMessage ); + // RAM drive + CreateSeedItemRamDriveL( *chunks ); + } + +#ifdef SYSMEMTRACKERLOGGING + { + const TInt chunkCount = chunks->Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = chunks->At( i ).Info(); + RDebug::Print( _L("CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsL() - AFTER RAMD - info[%03d]: type: %d, size: %d, name: %S"), i, info.iType, info.iSize, &info.iName ); + } + } +#endif + +// TODO: Uncomment after fix +// if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryUserStacks ) +// { +// RDebug::Print( KMemSpyKeepaliveMessage ); +// // Stacks ($DAT) +// CreateSeedItemsStacksL( *chunks ); +// } + +#ifdef SYSMEMTRACKERLOGGING + { + const TInt chunkCount = chunks->Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = chunks->At( i ).Info(); + RDebug::Print( _L("CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsL() - AFTER STACKS - info[%03d]: type: %d, size: %d, name: %S"), i, info.iType, info.iSize, &info.iName ); + } + } +#endif + +// TODO: Uncomment after fix +// if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryGlobalData ) +// { +// RDebug::Print( KMemSpyKeepaliveMessage ); +// // Global data (DLL$DATA) +// CreateSeedItemsGlobalDataL( *chunks ); +// } + + #ifdef SYSMEMTRACKERLOGGING + { + const TInt chunkCount = chunks->Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = chunks->At( i ).Info(); + RDebug::Print( _L("CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsL() - AFTER GLOBAL DATA - info[%03d]: type: %d, size: %d, name: %S"), i, info.iType, info.iSize, &info.iName ); + } + } +#endif + + // Don't need the chunks anymore + CleanupStack::PopAndDestroy( chunks ); + + if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryRAMLoadedCode ) + { + RDebug::Print( KMemSpyKeepaliveMessage ); + // Code + CreateSeedItemsCodeL(); + } + + if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryKernelHandles ) + { + // Handles + RDebug::Print( KMemSpyKeepaliveMessage); + CreateSeedItemsHandlesL(); + } + + if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryOpenFiles ) + { + RDebug::Print( KMemSpyKeepaliveMessage ); + // Open files + CreateSeedItemsOpenFilesL(); + } + + if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryDiskusage ) + { + RDebug::Print( KMemSpyKeepaliveMessage ); + // Disk space + CreateSeedItemsDiskSpaceL(); + } + + if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategorySystemMemory ) + { + RDebug::Print( KMemSpyKeepaliveMessage ); + // System memory + CreateSeedItemsSystemMemoryL(); + } + + if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryWindowGroups ) + { + RDebug::Print( KMemSpyKeepaliveMessage ); + // Window Server + CreateSeedItemsWindowServerL(); + } + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsHeapUserL( CMemSpyEngineChunkList& aList ) + { + CMemSpyEngine& engine = Engine(); + const TInt procCount = engine.Container().Count(); + for(TInt i=0; iHandle(), EMemSpyEngineSysMemTrackerTypeHeapUser ); + exists = entryIndex != KErrNotFound; + SYSMEMTRACKERLOG_PRINTF( RDebug::Printf( "CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsHeapUserL() - heapChunkHandle: 0x%08x, already exists: %d", entry->Handle(), exists ) ); + if ( exists ) + { + CMemSpyEngineHelperSysMemTrackerEntryHeap& sharedheapEntry = static_cast< CMemSpyEngineHelperSysMemTrackerEntryHeap& >( *iEntries[ entryIndex ] ); + sharedheapEntry.SetAsShared( ETrue ); + } + + // Remove utilised entries + if ( aList ) + { + aList->RemoveByHandle( (TAny*) entry->Handle() ); + } + + // Save + if ( !exists ) + { + AddItemAndPopL( entry ); + } + else + { + CleanupStack::PopAndDestroy( entry ); + } + } + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsHeapKernelL( CMemSpyEngineChunkList& aList ) + { + SYSMEMTRACKERLOG_PRINTF( RDebug::Printf( "CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsHeapKernelL() - START" ) ); + + CMemSpyEngine& engine = Engine(); + CMemSpyEngineHelperSysMemTrackerEntryHeap* entry = CMemSpyEngineHelperSysMemTrackerEntryHeap::NewKernelLC( iTracker ); + AddItemAndPopL( entry ); + + // Remove utilised entries + aList.RemoveByHandle( (TAny*) entry->Handle() ); + + SYSMEMTRACKERLOG_PRINTF( RDebug::Printf( "CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsHeapKernelL() - END" ) ); + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsChunkLocalL( CMemSpyEngineChunkList& aList ) + { + SYSMEMTRACKERLOG_PRINTF( RDebug::Printf( "CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsChunkL() - START" ) ); + + const TInt chunkCount = aList.Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = aList.At( i ).Info(); + SYSMEMTRACKERLOG_PRINTF( RDebug::Print( _L("CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsChunkLocalL() - info[%03d]: type: %d, pid: 0x%04x, size: %d, name: %S"), i, info.iType, info.iOwnerId, info.iSize, &info.iName ) ); + // + if ( info.iType == EMemSpyDriverChunkTypeLocal ) + { + // Try to find corresponding process + const TInt processIndex = Engine().Container().ProcessIndexById( info.iOwnerId ); + SYSMEMTRACKERLOG_PRINTF( RDebug::Print( _L("CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsChunkLocalL() - processIndex: %d"), processIndex ) ); + // + if ( processIndex >= 0 ) + { + CMemSpyProcess& process = Engine().Container().At( processIndex ); + // + TRAP_IGNORE( + CMemSpyEngineHelperSysMemTrackerEntryChunk* entry = CMemSpyEngineHelperSysMemTrackerEntryChunk::NewLC( iTracker, info, process ); + AddItemAndPopL( entry ); + ); + // + aList.Remove( i ); + } + } + } + + SYSMEMTRACKERLOG_PRINTF( RDebug::Printf( "CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsChunkL() - END" ) ); + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsChunkGlobalL( CMemSpyEngineChunkList& aList ) + { + const TInt chunkCount = aList.Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = aList.At( i ).Info(); + if ( info.iType == EMemSpyDriverChunkTypeGlobal ) + { + if ( CMemSpyEngineHelperFbServ::IsSharedBitmapChunk( info ) || CMemSpyEngineHelperFbServ::IsLargeBitmapChunk( info ) ) + { + // Don't process these two yet, they'll be handled by the bitmap code + } + else + { + TRAP_IGNORE( + CMemSpyEngineHelperSysMemTrackerEntryChunk* entry = CMemSpyEngineHelperSysMemTrackerEntryChunk::NewLC( iTracker, info ); + AddItemAndPopL( entry ); + ); + + // Remove processed item + aList.Remove( i ); + } + } + } + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemRamDriveL( CMemSpyEngineChunkList& aList ) + { + const TInt chunkCount = aList.Count(); + for( TInt i=chunkCount-1; i>=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = aList.At( i ).Info(); + if ( info.iType == EMemSpyDriverChunkTypeRamDrive ) + { + TRAP_IGNORE( + CMemSpyEngineHelperSysMemTrackerEntryRamDrive* entry = CMemSpyEngineHelperSysMemTrackerEntryRamDrive::NewLC( iTracker, info ); + AddItemAndPopL( entry ); + ); + + // Remove processed item + aList.Remove( i ); + } + } + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsStacksL( CMemSpyEngineChunkList& aList ) + { + CMemSpyEngine& engine = Engine(); + CMemSpyEngineObjectContainer& container = engine.Container(); + // + const TInt procCount = container.Count(); + for( TInt p=0; p= 0 ) + { + const TMemSpyDriverChunkInfo& stackChunkInfo = aList.At( index ).Info(); + // + const TInt threadCount = process.Count(); + for( TInt t=0; t=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = aList.At( i ).Info(); + + if ( info.iType == EMemSpyDriverChunkTypeGlobalData || info.iType == EMemSpyDriverChunkTypeStackAndProcessGlobalData ) + { + // Need to get associated process + const TInt processIndex = container.ProcessIndexById( info.iOwnerId ); + if ( processIndex >= 0 ) + { + CMemSpyProcess& process = container.At( processIndex ); + // + if ( info.iType == EMemSpyDriverChunkTypeGlobalData ) + { + if ( !( i % 10 ) ) // Print the message on only every 10th cycle + { + RDebug::Print( KMemSpyKeepaliveMessage ); + } + // Pure global data, unique chunk + TRAP_IGNORE( + CMemSpyEngineHelperSysMemTrackerGlobalData* entry = CMemSpyEngineHelperSysMemTrackerGlobalData::NewLC( iTracker, process, info ); + AddItemAndPopL( entry ); + ); + + // Remove processed item + aList.Remove( i ); + } + else if ( info.iType == EMemSpyDriverChunkTypeStackAndProcessGlobalData ) + { + if ( !( i % 10 ) ) // Print the message on only every 10th cycle + { + RDebug::Print( KMemSpyKeepaliveMessage ); + } + // We don't check uniqueness as any stack entries share a common handle with the process + // global data. + TRAP_IGNORE( + CMemSpyEngineHelperSysMemTrackerGlobalData* entry = CMemSpyEngineHelperSysMemTrackerGlobalData::NewLC( iTracker, process, info ); + AddItemAndPopL( entry ); + ); + + // Remove processed item + aList.Remove( i ); + } + } + } + } + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsCodeL() + { + CMemSpyEngineCodeSegList* code = Engine().HelperCodeSegment().CodeSegmentListRamLoadedL(); + CleanupStack::PushL( code ); + // + const TInt count = code->Count(); + for( TInt i=0; iAt( i ); + // + TRAP_IGNORE( + CMemSpyEngineHelperSysMemTrackerEntryCode* entry = CMemSpyEngineHelperSysMemTrackerEntryCode::NewLC( iTracker, info ); + AddItemAndPopL( entry ); + ); + } + // + CleanupStack::PopAndDestroy( code ); + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsHandlesL() + { + CMemSpyEngineGenericKernelObjectContainer* allContainers = Engine().HelperKernelContainers().ObjectsAllLightweightL(); + CleanupStack::PushL( allContainers ); + // + const TInt count = allContainers->Count(); + for( TInt i=0; iAt( i ); + // + const TInt entryCount = list.Count(); + for( TInt j=0; jCount(); + for( TInt t=0; tAt( t ); + // + const TInt entryCount = thread.Count(); + for( TInt e=0; e( i ) ); + AddItemAndPopL( entry ); + ); + } + } + } + } + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsSystemMemoryL() + { + TRAP_IGNORE( + CMemSpyEngineHelperSysMemTrackerEntrySystemMemory* entryT = CMemSpyEngineHelperSysMemTrackerEntrySystemMemory::NewLC( iTracker, ETypeTotal ); + AddItemAndPopL( entryT ); + ); + TRAP_IGNORE( + CMemSpyEngineHelperSysMemTrackerEntrySystemMemory* entryF = CMemSpyEngineHelperSysMemTrackerEntrySystemMemory::NewLC( iTracker, ETypeFree ); + AddItemAndPopL( entryF ); + ); + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsBitmapL( CMemSpyEngineChunkList& aList ) + { + TInt bitmapConCount = 0; + TInt fontConCount = 0; + // + RArray handles; + CleanupClosePushL( handles ); + Engine().HelperFbServ().GetArrayOfBitmapHandlesL( handles, bitmapConCount, fontConCount ); + // + const TInt count = handles.Count(); + for( TInt i=0; i=0; i-- ) + { + const TMemSpyDriverChunkInfo& info = aList.At( i ).Info(); + if ( CMemSpyEngineHelperFbServ::IsSharedBitmapChunk( info ) ) + { + SYSMEMTRACKERLOG_PRINTF( RDebug::Printf( "CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsBitmapL() - found FbsSharedChunk..." ) ); + infoChunkShared = info; + aList.Remove( i ); + } + else if ( CMemSpyEngineHelperFbServ::IsLargeBitmapChunk( info ) ) + { + SYSMEMTRACKERLOG_PRINTF( RDebug::Printf( "CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsBitmapL() - found FbsLargeChunk..." ) ); + infoChunkLarge = info; + aList.Remove( i ); + } + } + + TRAP_IGNORE( + CMemSpyEngineHelperSysMemTrackerEntryFbserv* entry = CMemSpyEngineHelperSysMemTrackerEntryFbserv::NewLC( iTracker, infoChunkLarge, infoChunkShared, bitmapConCount, fontConCount, count ); + AddItemAndPopL( entry ); + ); + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsFileServerCacheL( CMemSpyEngineChunkList& aList ) + { + TInt index = KErrNotFound; + const CMemSpyEngineChunkEntry* entry = Engine().HelperFileSystem().IdentifyCacheChunk( aList, index ); + // + if ( entry ) + { + const TMemSpyDriverChunkInfo& info = entry->Info(); + SYSMEMTRACKERLOG_PRINTF( RDebug::Printf( "CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsFileServerCacheL() - found F32 cache chunk..." ) ); + // + TRAP_IGNORE( + CMemSpyEngineHelperSysMemTrackerEntryFileServerCache* entry = CMemSpyEngineHelperSysMemTrackerEntryFileServerCache::NewLC( iTracker, info ); + AddItemAndPopL( entry ); + ); + // + aList.Remove( index ); + } + } + + +void CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsWindowServerL() + { + if ( Engine().IsHelperWindowServerSupported() ) + { + MMemSpyEngineHelperWindowServer& windowServerManager = Engine().HelperWindowServer(); + MMemSpyEngineWindowGroupList* windowGroupList = windowServerManager.WindowGroupListL(); + CleanupDeletePushL( windowGroupList ); + TInt count = windowGroupList->Count(); + TBool isFocused( EFalse ); + for ( TInt i = 0; i < count; i++ ) + { + TMemSpyEngineWindowGroupDetails windowGroupDetails; + windowServerManager.GetWindowGroupDetailsL( windowGroupList->At( i ).iId, windowGroupDetails ); + windowGroupDetails.iOrdinalPosition = windowGroupList->At( i ).iOrdinalPosition; + if ( !isFocused && windowGroupDetails.iPriority == 0 ) + { + windowGroupDetails.iIsFocused = ETrue; + isFocused = ETrue; + } + else + { + windowGroupDetails.iIsFocused = EFalse; + } + TRAP_IGNORE( + CMemSpyEngineHelperSysMemTrackerEntryWindowServer* entry = CMemSpyEngineHelperSysMemTrackerEntryWindowServer::NewLC( iTracker, windowGroupDetails ); + AddItemAndPopL( entry ); + ); + } + CleanupStack::PopAndDestroy( windowGroupList ); + } + else + { + SYSMEMTRACKERLOG_PRINTF( RDebug::Printf( "CMemSpyEngineHelperSysMemTrackerEntryManager::CreateSeedItemsWindowServerL() - Not supported" ) ); + } + } + + + +