memspy/Driver/Kernel/Include/MemSpyDriverInspectedProcess.h
changeset 0 a03f92240627
child 20 ca8a1b6995f6
--- /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