memspy/Driver/Shared/heaputils.h
branchRCL_3
changeset 59 8ad140f3dd41
parent 49 7fdc9a71d314
equal deleted inserted replaced
49:7fdc9a71d314 59:8ad140f3dd41
     1 // heaputils.h
       
     2 // 
       
     3 // Copyright (c) 2010 Accenture. All rights reserved.
       
     4 // This component and the accompanying materials are made available
       
     5 // under the terms of the "Eclipse Public License v1.0"
       
     6 // which accompanies this distribution, and is available
       
     7 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 // 
       
     9 // Initial Contributors:
       
    10 // Accenture - Initial contribution
       
    11 //
       
    12 
       
    13 
       
    14 #ifndef FSHELL_HEAP_UTILS_H
       
    15 #define FSHELL_HEAP_UTILS_H
       
    16 
       
    17 #include <e32cmn.h>
       
    18 
       
    19 #ifdef __KERNEL_MODE__
       
    20 class DThread;
       
    21 class DChunk;
       
    22 #else
       
    23 class RMemoryAccess;
       
    24 #endif // __KERNEL_MODE__
       
    25 
       
    26 #if defined(STANDALONE_ALLOCHELPER) || defined(__KERNEL_MODE__)
       
    27 #define HUIMPORT_C
       
    28 #define HUCLASS(x) NONSHARABLE_CLASS(x)
       
    29 #else
       
    30 #define HUIMPORT_C IMPORT_C
       
    31 #define HUCLASS(x) class x
       
    32 #endif
       
    33 
       
    34 namespace LtkUtils
       
    35 	{
       
    36 
       
    37 class THeapInfo;
       
    38 	
       
    39 HUCLASS(RAllocatorHelper) // class RAllocatorHelper
       
    40 	{
       
    41 public:
       
    42 	HUIMPORT_C RAllocatorHelper();
       
    43 #ifdef __KERNEL_MODE__
       
    44 	TInt OpenKernelHeap();
       
    45 #else
       
    46 	HUIMPORT_C TInt Open(RAllocator* aAllocator);
       
    47 #endif
       
    48 	HUIMPORT_C TInt SetCellNestingLevel(TAny* aCell, TInt aNestingLevel);
       
    49 	HUIMPORT_C TInt GetCellNestingLevel(TAny* aCell, TInt& aNestingLevel);
       
    50 	HUIMPORT_C TInt AllocCountForCell(TAny* aCell) const;
       
    51 	HUIMPORT_C TLinAddr AllocatorAddress() const;
       
    52 	HUIMPORT_C TInt RefreshDetails();
       
    53 	
       
    54 	HUIMPORT_C TInt CommittedSize();
       
    55 	HUIMPORT_C TInt AllocatedSize();
       
    56 	HUIMPORT_C TInt AllocationCount();
       
    57 	HUIMPORT_C TInt MaxCommittedSize();
       
    58 	HUIMPORT_C TInt MinCommittedSize();
       
    59 	HUIMPORT_C TInt CountUnusedPages();
       
    60 	HUIMPORT_C TInt CommittedFreeSpace();
       
    61 
       
    62 	enum TCellType
       
    63 		{
       
    64 		EAllocation, EFreeSpace, EBadness
       
    65 		};
       
    66 
       
    67 	enum TExtendedCellType
       
    68 		{
       
    69 		EAllocationMask = 0xFF,
       
    70 		EFreeMask = 0xFF00,
       
    71 		EBadnessMask = 0xFF000000,
       
    72 
       
    73 		EHeapAllocation = 1,
       
    74 		EDlaAllocation = 2,
       
    75 		EPageAllocation = 3,
       
    76 		ESlabAllocation = 4,
       
    77 		
       
    78 		EHeapFreeCell = 0x0100,
       
    79 		EDlaFreeCell = 0x0200,
       
    80 		// There is nothing 'free' in the page allocator
       
    81 		ESlabFreeCell = 0x0300, // Used to track free cells in partially-filled slabs
       
    82 		ESlabFreeSlab = 0x0400, // Used to track entirely empty slabs (that don't have a specific cell size)
       
    83 
       
    84 		EHeapBadFreeCellAddress = 0x01000000,
       
    85 		EHeapBadFreeCellSize = 0x02000000,
       
    86 		EHeapBadAllocatedCellSize = 0x03000000,
       
    87 		EHeapBadAllocatedCellAddress = 0x04000000,
       
    88 		};
       
    89 			
       
    90 	// TBool WalkFunc(TAny* aContext, TCellType aCellType, TLinAddr aCellPtr, TInt aCellLength)
       
    91 	// aCellPtr points to the start of the cell payload for allocated cells (unlike RHeap's walker, which points to the cell header)
       
    92 	// aCellLength is the payload length, ie what AllocLen(aCellPtr) would return
       
    93 	// return ETrue to continue walking, EFalse to stop the walk
       
    94 	typedef TBool (*TWalkFunc)(TAny*, TCellType, TLinAddr, TInt);
       
    95 	typedef TBool (*TWalkFunc2)(RAllocatorHelper&, TAny*, TCellType, TLinAddr, TInt);
       
    96 	typedef TBool (*TWalkFunc3)(RAllocatorHelper&, TAny*, TExtendedCellType, TLinAddr, TInt);
       
    97 	HUIMPORT_C TInt Walk(TWalkFunc aCallbackFn, TAny* aContext);
       
    98 	HUIMPORT_C TInt Walk(TWalkFunc2 aCallbackFn, TAny* aContext); // Like the other but the walk func gives you the RAllocatorHelper pointer too
       
    99 	HUIMPORT_C TInt Walk(TWalkFunc3 aCallbackFn, TAny* aContext); // Like the other but the walk func gives you more details about the allocation type
       
   100 	HUIMPORT_C TInt SizeForCellType(TExtendedCellType aType);
       
   101 	HUIMPORT_C TInt CountForCellType(TExtendedCellType aType);
       
   102 	HUIMPORT_C TBool AllocatorIsUdeb() const;
       
   103 	HUIMPORT_C const TDesC& Description() const;
       
   104 	HUIMPORT_C virtual void Close();
       
   105 
       
   106 #ifdef __KERNEL_MODE__
       
   107 	virtual DChunk* OpenUnderlyingChunk(); // Must be in CS
       
   108 	enum TType
       
   109 		{
       
   110 		ETypeUnknown,
       
   111 		ETypeRHeap,
       
   112 		ETypeRHybridHeap,
       
   113 		};
       
   114 	TType GetType() const; // This is for information only, nothing should care about the return value
       
   115 #endif
       
   116 
       
   117 protected:
       
   118 	TInt FinishConstruction();
       
   119 	TInt IdentifyAllocatorType(TBool aAllocatorIsUdeb, TBool aIsTheKernelHeap=EFalse);
       
   120 	TInt OpenChunkHeap(TLinAddr aChunkBase, TInt aChunkMaxSize);
       
   121 #ifndef __KERNEL_MODE__
       
   122 	static TInt EuserIsUdeb();
       
   123 #endif
       
   124 	virtual TInt ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const;
       
   125 	virtual TInt WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize);
       
   126 	virtual TInt TryLock();
       
   127 	virtual void TryUnlock();
       
   128 
       
   129 private:
       
   130 	TInt ReadWord(TLinAddr aLocation, TUint32& aResult) const;
       
   131 	TInt ReadByte(TLinAddr aLocation, TUint8& aResult) const;
       
   132 	TInt WriteWord(TLinAddr aLocation, TUint32 aWord);
       
   133 	TInt RefreshDetails(TUint aMask);
       
   134 	TInt DoRefreshDetails(TUint aMask);
       
   135 	TInt CheckValid(TUint aMask);
       
   136 	TInt DoWalk(TWalkFunc3 aCallbackFn, TAny* aContext);
       
   137 	TInt OldSkoolWalk(TWalkFunc3 aCallbackFn, TAny* aContext);
       
   138 	TInt NewHotnessWalk(TWalkFunc3 aCallbackFn, TAny* aContext);
       
   139 	static TBool DispatchClientWalkCallback(RAllocatorHelper& aHelper, TAny* aContext, TExtendedCellType aCellType, TLinAddr aCellPtr, TInt aCellLength);
       
   140 	static TBool WalkForStats(RAllocatorHelper& aSelf, TAny* aContext, TExtendedCellType aType, TLinAddr aCellPtr, TInt aCellLength);
       
   141 	TUint PageMapOperatorBrackets(unsigned ix, TInt& err) const;
       
   142 	TInt PageMapFind(TUint start, TUint bit, TInt& err);
       
   143 	TUint PageMapBits(unsigned ix, unsigned len, TInt& err);
       
   144 	TUint PagedDecode(TUint pos, TInt& err);
       
   145 	TInt TreeWalk(TUint32 aSlabRoot, TInt aSlabType, TWalkFunc3 aCallbackFn, TAny* aContext, TBool& shouldContinue);
       
   146 protected:
       
   147 	TLinAddr iAllocatorAddress;
       
   148 	enum TAllocatorType
       
   149 		{
       
   150 		EUnknown,
       
   151 		EAllocator,
       
   152 		EUrelOldRHeap,
       
   153 		EUdebOldRHeap,
       
   154 		EUrelHybridHeap,
       
   155 		EUdebHybridHeap,
       
   156 		};
       
   157 	TAllocatorType iAllocatorType;
       
   158 private:
       
   159 	THeapInfo* iInfo;
       
   160 	TUint iValidInfo;
       
   161 	TUint8* iTempSlabBitmap;
       
   162 	mutable TAny* iPageCache;
       
   163 	mutable TLinAddr iPageCacheAddr;
       
   164 #ifdef __KERNEL_MODE__
       
   165 	DChunk* iChunk;
       
   166 	//TUint iSpare[0];
       
   167 #else
       
   168 	TUint iSpare[1];
       
   169 #endif
       
   170 	};
       
   171 
       
   172 #ifdef __KERNEL_MODE__
       
   173 
       
   174 class RKernelSideAllocatorHelper : public RAllocatorHelper
       
   175 	{
       
   176 public:
       
   177 	RKernelSideAllocatorHelper();
       
   178 	TInt OpenUserHeap(TUint aThreadId, TLinAddr aAllocatorAddress, TBool aEuserIsUdeb);
       
   179 	virtual DChunk* OpenUnderlyingChunk(); // Must be in CS
       
   180 	virtual void Close();
       
   181 
       
   182 protected:
       
   183 	virtual TInt ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const;
       
   184 	virtual TInt WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize);
       
   185 	virtual TInt TryLock();
       
   186 	virtual void TryUnlock();
       
   187 private:
       
   188 	DThread* iThread;
       
   189 	};
       
   190 
       
   191 #else
       
   192 
       
   193 class RProxyAllocatorHelper : public RAllocatorHelper
       
   194 	{
       
   195 public:
       
   196 	HUIMPORT_C RProxyAllocatorHelper();
       
   197 	HUIMPORT_C TInt Open(RMemoryAccess& aMem, TUint aThreadId);
       
   198 	HUIMPORT_C TInt OpenChunkHeap(RMemoryAccess& aMem, TAny* aDChunkPtr);
       
   199 	HUIMPORT_C virtual void Close();
       
   200 
       
   201 protected:
       
   202 	virtual TInt ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const;
       
   203 	virtual TInt WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize);
       
   204 	virtual TInt TryLock();
       
   205 	virtual void TryUnlock();
       
   206 
       
   207 private:
       
   208 	RMemoryAccess* iMemoryAccess;
       
   209 	TUint iThreadId;
       
   210 	};
       
   211 
       
   212 #endif // __KERNEL_MODE__
       
   213 
       
   214 	} // namespace LtkUtils
       
   215 
       
   216 #endif