diff -r 000000000000 -r a03f92240627 memspy/Driver/Kernel/Include/MemSpyDriverInspectedProcess.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/memspy/Driver/Kernel/Include/MemSpyDriverInspectedProcess.h Tue Feb 02 01:57:15 2010 +0200 @@ -0,0 +1,179 @@ +/* +* 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: +* +*/ + +#ifndef MEMSPYINSPECTEDPROCESS_H +#define MEMSPYINSPECTEDPROCESS_H + +// System includes +#include + +// Shared includes +#include + +// User includes +#include "MemSpyDriverUtils.h" +#include "MemSpyDriverEventMonitor.h" + +// Classes referenced +class DMemSpyInspectedProcessManager; +class TMemSpyDriverProcessInspectionInfo; + + + +class TMemSpyTrackedChunk + { +public: + enum TType + { + ETypeNotRelevant = -1, + // + ETypeChunkHeap = 0, + ETypeChunkLocal, + ETypeChunkGlobalData, + ETypeChunkProcessGlobalDataAndUserStack, + ETypeChunkShared + }; + +public: + TMemSpyTrackedChunk( DChunk* aChunk, TType aType ); + +public: // API + void SetSize( TInt aSize ); + TInt Size() const { return iSize; } + // + void SetUnused( TBool aUnused ); + TBool Unused() const { return iUnused; } + // + TAny* Handle() const { return iChunk; } + // + inline TType Type() const { return iType; } + inline void SetType( TType aType ) { iType = aType; } + +public: // Data members + SDblQueLink iLink; + DChunk* iChunk; + TType iType; + TInt iSize; + TBool iUnused; + }; + + +class TMemSpyTrackedChunkChangeInfo + { +public: // Data members + TMemSpyDriverProcessInspectionInfo iInfo; + SDblQueLink iLink; + }; + + + + + +class DMemSpyInspectedProcess : public DBase, public MMemSpyEventMonitorObserver + { +public: // Construct / destruct + DMemSpyInspectedProcess( DMemSpyDriverDevice& aDevice ); + ~DMemSpyInspectedProcess(); + +public: // API + TInt Open( DProcess* aProcess ); + inline TUint ProcessId() const { return iProcessId; } + +public: // Change notification API + TInt NotifyOnChange( DThread* aThread, TRequestStatus* aRequestStatus, TMemSpyDriverProcessInspectionInfo* aInfo ); + TInt NotifyOnChangeCancel(); + TBool NotifyOnChangeQueued() const; + +public: // Queue link + SDblQueLink iLink; + +public: // From MMemSpyEventMonitorObserver + TUint EMTypeMask() const; + void EMHandleProcessUpdated( DProcess& aProcess ); + void EMHandleProcessRemoved( DProcess& aProcess ); + void EMHandleThreadAdd( DThread& aThread ); + void EMHandleThreadRemoved( DThread& aThread ); + void EMHandleThreadKilled( DThread& aThread ); + void EMHandleChunkAdd( DChunk& aChunk ); + void EMHandleChunkUpdated( DChunk& aChunk ); + void EMHandleChunkDeleted( DChunk& aChunk ); + + // Internal helper + void EMHandleThreadChanged( DThread& aThread ); + +private: // Tracked item management + void ResetTrackedList(); + void SetTrackedListUnused(); + void SetTrackedListUnusedStatusByType( TMemSpyTrackedChunk::TType aType, TBool aUnusedStatus ); + void DiscardUnusedTrackListItems(); + void AddTrackedChunk( DChunk* aChunk, TMemSpyTrackedChunk::TType aType ); + TMemSpyTrackedChunk* TrackedChunkByHandle( TAny* aHandle ); + +private: // Internal methods + DMemSpyInspectedProcessManager& PManager(); + DMemSpyEventMonitor& EventMonitor(); + TMemSpyTrackedChunk::TType ChunkType( DObject* aObject ) const; + TBool IsHeapChunk( DChunk& aChunk, const TName& aName ) const; + static TUint32 TotalStatistics( const TMemSpyDriverProcessInspectionInfo& aStats, TBool aIncludeShared = ETrue ); + static TBool IsEqual( const TMemSpyDriverProcessInspectionInfo& aLeft, const TMemSpyDriverProcessInspectionInfo& aRight ); + void ResetStatistics( TMemSpyDriverProcessInspectionInfo& aStats ); + TBool UpdateStatistics(); + void CompleteClientsRequest( TInt aCompletionCode, TMemSpyDriverProcessInspectionInfo* aInfo = NULL ); + void FindChunks( DProcess& aProcess ); + TInt StackSize( DProcess& aProcess ); + void ResetPendingChanges(); + void PrintChunkInfo( DChunk& aChunk ) const; + TBool IsChunkRelevantToOurProcess( DChunk& aChunk ) const; + +public: // Queue link for process manager + SDblQueLink iPMLink; + +private: // Data members + DMemSpyDriverDevice& iDevice; + DMutex* iLock; + TUint iProcessId; + DProcess* iProcess; + TBool iAmDead; + + // This differs from the 'inspection info' iMemoryStack field + // because it just contains the size of all user-thread stacks + // within the process. + TInt iUserThreadStackSize; + + // Tracking chunks mapped into process + SDblQue iTrackedChunks; + + // Changes that have occurred whilst the client was AWOL + SDblQue iPendingChanges; + + // Tracking totals + TMemSpyDriverProcessInspectionInfo iInfoLast; + TMemSpyDriverProcessInspectionInfo iInfoCurrent; + TMemSpyDriverProcessInspectionInfo iInfoPeaks; + TMemSpyDriverProcessInspectionInfo iInfoHWMIncShared; + TMemSpyDriverProcessInspectionInfo iInfoHWMExcShared; + + // For change notification + TInt iChangeDeliveryCounter; + DThread* iChangeObserverThread; + TRequestStatus* iChangeObserverRS; + TMemSpyDriverProcessInspectionInfo* iChangeObserverInfo; + TBool iEventReceivedWhilstObserverWasAWOL; + }; + + +#endif