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