--- 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;