diff -r ca8a1b6995f6 -r 52e343bb8f80 memspy/Driver/Kernel/Include/MemSpyDriverHeapWalker.h --- a/memspy/Driver/Kernel/Include/MemSpyDriverHeapWalker.h Tue Aug 31 16:45:49 2010 +0300 +++ b/memspy/Driver/Kernel/Include/MemSpyDriverHeapWalker.h Wed Sep 01 12:37:10 2010 +0100 @@ -29,23 +29,32 @@ #include "MemSpyDriverHeap.h" #include "MemSpyDriverHeapStatistics.h" -#include "heaputils.h" -using namespace LtkUtils; // Heap walker observer interface - can be used to make a record of each cell class MMemSpyHeapWalkerObserver { public: - virtual TBool HandleHeapCell(TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber) = 0; + virtual TBool HandleHeapCell( TInt aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber ) = 0; virtual void HandleHeapWalkInit() = 0; }; + +// A null observer that is used to collect basic statistics +class TMemSpyHeapWalkerNullObserver : public MMemSpyHeapWalkerObserver + { +public: + TBool HandleHeapCell( TInt /*aCellType*/, TAny* /*aCellAddress*/, TInt /*aLength*/, TInt /*aNestingLevel*/, TInt /*aAllocNumber*/ ) { return ETrue; } + void HandleHeapWalkInit() { } + }; + + // Heap walker - allows in-place walking of any heap class RMemSpyDriverHeapWalker { public: - RMemSpyDriverHeapWalker(RMemSpyDriverRHeapBase& aHeap, MMemSpyHeapWalkerObserver* aObserver=NULL); + RMemSpyDriverHeapWalker( RMemSpyDriverRHeapBase& aHeap, TBool aDebugAllocator ); + RMemSpyDriverHeapWalker( RMemSpyDriverRHeapBase& aHeap, TBool aDebugAllocator, MMemSpyHeapWalkerObserver& aObserver ); public: // API TInt Traverse(); @@ -54,9 +63,12 @@ inline void SetPrintDebug() { iPrintDebug = ETrue; } inline const TMemSpyHeapWalkStatistics& Stats() const { return iStats; } +public: // Utility functions + static TAny* KernelAddress( TAny* aUserAddress, TUint aDelta ); + static TAny* UserAddress( TAny* aKernelAddress, TUint aDelta ); + static RMemSpyDriverRHeapBase::SCell* CellByUserAddress( TAny* aAddress, TUint aDelta ); + private: // Internal methods - static TBool CellCallback(RAllocatorHelper& aHelper, TAny* aContext, RAllocatorHelper::TExtendedCellType aCellType, TLinAddr aCellAddress, TInt aLength); - TBool DoCellCallback(RAllocatorHelper& aHelper, RAllocatorHelper::TExtendedCellType aCellType, TLinAddr aCellAddress, TInt aLength); TBool NotifyCell( TMemSpyDriverCellType aType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel = -1, TInt aAllocNumber = -1 ); // void UpdateStats( TMemSpyDriverCellType aType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber ); @@ -64,10 +76,14 @@ void FinaliseStats(); void PrintStats(); // + TAny* KernelAddress( TAny* aUserAddress ) const; + TAny* UserAddress( TAny* aKernelAddress ) const; + // inline TBool PrintDebug() const { return iPrintDebug; } private: RMemSpyDriverRHeapBase& iHeap; + TBool iIsDebugAllocator; TBool iPrintDebug; MMemSpyHeapWalkerObserver* iObserver; TMemSpyHeapWalkStatistics iStats;