diff -r 185201be11b0 -r 516af714ebb4 memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTrackerEntryManager.cpp --- a/memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTrackerEntryManager.cpp Thu Sep 02 22:05:40 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1150 +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 "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" ) ); - } - } - - - -