--- /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 <kern_priv.h>
+
+// Shared includes
+#include <memspy/driver/memspydriverobjectsshared.h>
+
+// 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