perfsrv/memspy/Driver/Shared/heaputils.h
author hgs
Tue, 26 Oct 2010 16:20:32 +0300
changeset 62 1c2bb2fc7c87
parent 54 a151135b0cf9
permissions -rw-r--r--
201043
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
//
62
hgs
parents: 54
diff changeset
    12
// Contributors:
hgs
parents: 54
diff changeset
    13
// Adrian Issott (Nokia) - Updates for kernel-side alloc helper & RHybridHeap v2
hgs
parents: 54
diff changeset
    14
//
51
hgs
parents:
diff changeset
    15
hgs
parents:
diff changeset
    16
#ifndef FSHELL_HEAP_UTILS_H
hgs
parents:
diff changeset
    17
#define FSHELL_HEAP_UTILS_H
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include <e32cmn.h>
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#ifdef __KERNEL_MODE__
hgs
parents:
diff changeset
    22
class DThread;
hgs
parents:
diff changeset
    23
class DChunk;
hgs
parents:
diff changeset
    24
#else
hgs
parents:
diff changeset
    25
class RMemoryAccess;
hgs
parents:
diff changeset
    26
#endif // __KERNEL_MODE__
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
#if defined(STANDALONE_ALLOCHELPER) || defined(__KERNEL_MODE__)
hgs
parents:
diff changeset
    29
#define HUIMPORT_C
hgs
parents:
diff changeset
    30
#define HUCLASS(x) NONSHARABLE_CLASS(x)
hgs
parents:
diff changeset
    31
#else
hgs
parents:
diff changeset
    32
#define HUIMPORT_C IMPORT_C
hgs
parents:
diff changeset
    33
#define HUCLASS(x) class x
hgs
parents:
diff changeset
    34
#endif
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
namespace LtkUtils
hgs
parents:
diff changeset
    37
	{
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
class THeapInfo;
hgs
parents:
diff changeset
    40
	
hgs
parents:
diff changeset
    41
HUCLASS(RAllocatorHelper) // class RAllocatorHelper
hgs
parents:
diff changeset
    42
	{
hgs
parents:
diff changeset
    43
public:
hgs
parents:
diff changeset
    44
	HUIMPORT_C RAllocatorHelper();
hgs
parents:
diff changeset
    45
#ifdef __KERNEL_MODE__
62
hgs
parents: 54
diff changeset
    46
	static TLinAddr GetKernelAllocator(DChunk* aKernelChunk);
51
hgs
parents:
diff changeset
    47
	TInt OpenKernelHeap();
hgs
parents:
diff changeset
    48
#else
hgs
parents:
diff changeset
    49
	HUIMPORT_C TInt Open(RAllocator* aAllocator);
hgs
parents:
diff changeset
    50
#endif
hgs
parents:
diff changeset
    51
	HUIMPORT_C TInt SetCellNestingLevel(TAny* aCell, TInt aNestingLevel);
hgs
parents:
diff changeset
    52
	HUIMPORT_C TInt GetCellNestingLevel(TAny* aCell, TInt& aNestingLevel);
hgs
parents:
diff changeset
    53
	HUIMPORT_C TInt AllocCountForCell(TAny* aCell) const;
hgs
parents:
diff changeset
    54
	HUIMPORT_C TLinAddr AllocatorAddress() const;
hgs
parents:
diff changeset
    55
	HUIMPORT_C TInt RefreshDetails();
hgs
parents:
diff changeset
    56
	
hgs
parents:
diff changeset
    57
	HUIMPORT_C TInt CommittedSize();
hgs
parents:
diff changeset
    58
	HUIMPORT_C TInt AllocatedSize();
hgs
parents:
diff changeset
    59
	HUIMPORT_C TInt AllocationCount();
hgs
parents:
diff changeset
    60
	HUIMPORT_C TInt MaxCommittedSize();
hgs
parents:
diff changeset
    61
	HUIMPORT_C TInt MinCommittedSize();
hgs
parents:
diff changeset
    62
	HUIMPORT_C TInt CountUnusedPages();
hgs
parents:
diff changeset
    63
	HUIMPORT_C TInt CommittedFreeSpace();
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
	enum TCellType
hgs
parents:
diff changeset
    66
		{
hgs
parents:
diff changeset
    67
		EAllocation, EFreeSpace, EBadness
hgs
parents:
diff changeset
    68
		};
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
	enum TExtendedCellType
hgs
parents:
diff changeset
    71
		{
hgs
parents:
diff changeset
    72
		EAllocationMask = 0xFF,
hgs
parents:
diff changeset
    73
		EFreeMask = 0xFF00,
hgs
parents:
diff changeset
    74
		EBadnessMask = 0xFF000000,
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
		EHeapAllocation = 1,
hgs
parents:
diff changeset
    77
		EDlaAllocation = 2,
hgs
parents:
diff changeset
    78
		EPageAllocation = 3,
hgs
parents:
diff changeset
    79
		ESlabAllocation = 4,
hgs
parents:
diff changeset
    80
		
hgs
parents:
diff changeset
    81
		EHeapFreeCell = 0x0100,
hgs
parents:
diff changeset
    82
		EDlaFreeCell = 0x0200,
hgs
parents:
diff changeset
    83
		// There is nothing 'free' in the page allocator
hgs
parents:
diff changeset
    84
		ESlabFreeCell = 0x0300, // Used to track free cells in partially-filled slabs
hgs
parents:
diff changeset
    85
		ESlabFreeSlab = 0x0400, // Used to track entirely empty slabs (that don't have a specific cell size)
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
		EHeapBadFreeCellAddress = 0x01000000,
hgs
parents:
diff changeset
    88
		EHeapBadFreeCellSize = 0x02000000,
hgs
parents:
diff changeset
    89
		EHeapBadAllocatedCellSize = 0x03000000,
hgs
parents:
diff changeset
    90
		EHeapBadAllocatedCellAddress = 0x04000000,
hgs
parents:
diff changeset
    91
		};
hgs
parents:
diff changeset
    92
			
hgs
parents:
diff changeset
    93
	// TBool WalkFunc(TAny* aContext, TCellType aCellType, TLinAddr aCellPtr, TInt aCellLength)
hgs
parents:
diff changeset
    94
	// 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
    95
	// aCellLength is the payload length, ie what AllocLen(aCellPtr) would return
hgs
parents:
diff changeset
    96
	// return ETrue to continue walking, EFalse to stop the walk
hgs
parents:
diff changeset
    97
	typedef TBool (*TWalkFunc)(TAny*, TCellType, TLinAddr, TInt);
hgs
parents:
diff changeset
    98
	typedef TBool (*TWalkFunc2)(RAllocatorHelper&, TAny*, TCellType, TLinAddr, TInt);
hgs
parents:
diff changeset
    99
	typedef TBool (*TWalkFunc3)(RAllocatorHelper&, TAny*, TExtendedCellType, TLinAddr, TInt);
hgs
parents:
diff changeset
   100
	HUIMPORT_C TInt Walk(TWalkFunc aCallbackFn, TAny* aContext);
hgs
parents:
diff changeset
   101
	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
   102
	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
   103
	HUIMPORT_C TInt SizeForCellType(TExtendedCellType aType);
hgs
parents:
diff changeset
   104
	HUIMPORT_C TInt CountForCellType(TExtendedCellType aType);
hgs
parents:
diff changeset
   105
	HUIMPORT_C TBool AllocatorIsUdeb() const;
hgs
parents:
diff changeset
   106
	HUIMPORT_C const TDesC& Description() const;
hgs
parents:
diff changeset
   107
	HUIMPORT_C virtual void Close();
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
#ifdef __KERNEL_MODE__
hgs
parents:
diff changeset
   110
	virtual DChunk* OpenUnderlyingChunk(); // Must be in CS
hgs
parents:
diff changeset
   111
	enum TType
hgs
parents:
diff changeset
   112
		{
hgs
parents:
diff changeset
   113
		ETypeUnknown,
hgs
parents:
diff changeset
   114
		ETypeRHeap,
hgs
parents:
diff changeset
   115
		ETypeRHybridHeap,
62
hgs
parents: 54
diff changeset
   116
        ETypeRHybridHeapV2,
51
hgs
parents:
diff changeset
   117
		};
hgs
parents:
diff changeset
   118
	TType GetType() const; // This is for information only, nothing should care about the return value
hgs
parents:
diff changeset
   119
#endif
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
protected:
hgs
parents:
diff changeset
   122
	TInt FinishConstruction();
hgs
parents:
diff changeset
   123
	TInt IdentifyAllocatorType(TBool aAllocatorIsUdeb, TBool aIsTheKernelHeap=EFalse);
hgs
parents:
diff changeset
   124
	TInt OpenChunkHeap(TLinAddr aChunkBase, TInt aChunkMaxSize);
hgs
parents:
diff changeset
   125
#ifndef __KERNEL_MODE__
hgs
parents:
diff changeset
   126
	static TInt EuserIsUdeb();
hgs
parents:
diff changeset
   127
#endif
hgs
parents:
diff changeset
   128
	virtual TInt ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const;
hgs
parents:
diff changeset
   129
	virtual TInt WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize);
62
hgs
parents: 54
diff changeset
   130
	
hgs
parents: 54
diff changeset
   131
	void SetIsKernelHeapAllocator(TBool aIsKernelHeapAllocator);
hgs
parents: 54
diff changeset
   132
	TBool GetIsKernelHeapAllocator() const;	
hgs
parents: 54
diff changeset
   133
	
52
hgs
parents: 51
diff changeset
   134
#ifndef __KERNEL_MODE__
hgs
parents: 51
diff changeset
   135
protected:
hgs
parents: 51
diff changeset
   136
#else
hgs
parents: 51
diff changeset
   137
public:
hgs
parents: 51
diff changeset
   138
#endif	
51
hgs
parents:
diff changeset
   139
	virtual TInt TryLock();
hgs
parents:
diff changeset
   140
	virtual void TryUnlock();
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
private:
hgs
parents:
diff changeset
   143
	TInt ReadWord(TLinAddr aLocation, TUint32& aResult) const;
hgs
parents:
diff changeset
   144
	TInt ReadByte(TLinAddr aLocation, TUint8& aResult) const;
hgs
parents:
diff changeset
   145
	TInt WriteWord(TLinAddr aLocation, TUint32 aWord);
hgs
parents:
diff changeset
   146
	TInt RefreshDetails(TUint aMask);
hgs
parents:
diff changeset
   147
	TInt DoRefreshDetails(TUint aMask);
hgs
parents:
diff changeset
   148
	TInt CheckValid(TUint aMask);
hgs
parents:
diff changeset
   149
	TInt DoWalk(TWalkFunc3 aCallbackFn, TAny* aContext);
hgs
parents:
diff changeset
   150
	TInt OldSkoolWalk(TWalkFunc3 aCallbackFn, TAny* aContext);
hgs
parents:
diff changeset
   151
	TInt NewHotnessWalk(TWalkFunc3 aCallbackFn, TAny* aContext);
hgs
parents:
diff changeset
   152
	static TBool DispatchClientWalkCallback(RAllocatorHelper& aHelper, TAny* aContext, TExtendedCellType aCellType, TLinAddr aCellPtr, TInt aCellLength);
hgs
parents:
diff changeset
   153
	static TBool WalkForStats(RAllocatorHelper& aSelf, TAny* aContext, TExtendedCellType aType, TLinAddr aCellPtr, TInt aCellLength);
hgs
parents:
diff changeset
   154
	TUint PageMapOperatorBrackets(unsigned ix, TInt& err) const;
hgs
parents:
diff changeset
   155
	TInt PageMapFind(TUint start, TUint bit, TInt& err);
hgs
parents:
diff changeset
   156
	TUint PageMapBits(unsigned ix, unsigned len, TInt& err);
hgs
parents:
diff changeset
   157
	TUint PagedDecode(TUint pos, TInt& err);
hgs
parents:
diff changeset
   158
	TInt TreeWalk(TUint32 aSlabRoot, TInt aSlabType, TWalkFunc3 aCallbackFn, TAny* aContext, TBool& shouldContinue);
62
hgs
parents: 54
diff changeset
   159
hgs
parents: 54
diff changeset
   160
private:
hgs
parents: 54
diff changeset
   161
	TInt PageMapOffset() const;
hgs
parents: 54
diff changeset
   162
    TInt MallocStateOffset() const;
hgs
parents: 54
diff changeset
   163
    TInt SparePageOffset() const;
hgs
parents: 54
diff changeset
   164
    TInt PartialPageOffset() const;
hgs
parents: 54
diff changeset
   165
    TInt FullSlabOffset() const;
hgs
parents: 54
diff changeset
   166
    TInt SlabAllocOffset() const;
hgs
parents: 54
diff changeset
   167
    TInt UserInitialHeapMetaDataSize() const;
hgs
parents: 54
diff changeset
   168
51
hgs
parents:
diff changeset
   169
protected:
hgs
parents:
diff changeset
   170
	TLinAddr iAllocatorAddress;
hgs
parents:
diff changeset
   171
	enum TAllocatorType
hgs
parents:
diff changeset
   172
		{
62
hgs
parents: 54
diff changeset
   173
		EAllocatorNotSet,
hgs
parents: 54
diff changeset
   174
		EAllocatorUnknown,
51
hgs
parents:
diff changeset
   175
		EUrelOldRHeap,
hgs
parents:
diff changeset
   176
		EUdebOldRHeap,
hgs
parents:
diff changeset
   177
		EUrelHybridHeap,
hgs
parents:
diff changeset
   178
		EUdebHybridHeap,
62
hgs
parents: 54
diff changeset
   179
        EUrelHybridHeapV2,
hgs
parents: 54
diff changeset
   180
        EUdebHybridHeapV2,
51
hgs
parents:
diff changeset
   181
		};
hgs
parents:
diff changeset
   182
	TAllocatorType iAllocatorType;
62
hgs
parents: 54
diff changeset
   183
	
51
hgs
parents:
diff changeset
   184
private:
hgs
parents:
diff changeset
   185
	THeapInfo* iInfo;
62
hgs
parents: 54
diff changeset
   186
	TBool iIsKernelHeapAllocator;
51
hgs
parents:
diff changeset
   187
	TUint8* iTempSlabBitmap;
hgs
parents:
diff changeset
   188
	mutable TAny* iPageCache;
hgs
parents:
diff changeset
   189
	mutable TLinAddr iPageCacheAddr;
hgs
parents:
diff changeset
   190
#ifdef __KERNEL_MODE__
hgs
parents:
diff changeset
   191
	DChunk* iChunk;
hgs
parents:
diff changeset
   192
	//TUint iSpare[0];
hgs
parents:
diff changeset
   193
#else
hgs
parents:
diff changeset
   194
	TUint iSpare[1];
hgs
parents:
diff changeset
   195
#endif
hgs
parents:
diff changeset
   196
	};
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
#ifdef __KERNEL_MODE__
hgs
parents:
diff changeset
   199
54
hgs
parents: 52
diff changeset
   200
HUCLASS(RUserAllocatorHelper) : public RAllocatorHelper
52
hgs
parents: 51
diff changeset
   201
    {
51
hgs
parents:
diff changeset
   202
public:
52
hgs
parents: 51
diff changeset
   203
    RUserAllocatorHelper();
hgs
parents: 51
diff changeset
   204
    TInt OpenUserHeap(TUint aThreadId, TLinAddr aAllocatorAddress, TBool aEuserIsUdeb);
hgs
parents: 51
diff changeset
   205
    virtual DChunk* OpenUnderlyingChunk(); // Must be in CS
hgs
parents: 51
diff changeset
   206
    virtual void Close();
51
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
protected:
52
hgs
parents: 51
diff changeset
   209
    virtual TInt ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const;
hgs
parents: 51
diff changeset
   210
    virtual TInt WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize);
hgs
parents: 51
diff changeset
   211
    virtual TInt TryLock();
hgs
parents: 51
diff changeset
   212
    virtual void TryUnlock();
51
hgs
parents:
diff changeset
   213
private:
52
hgs
parents: 51
diff changeset
   214
    DThread* iThread;
hgs
parents: 51
diff changeset
   215
    };
hgs
parents: 51
diff changeset
   216
54
hgs
parents: 52
diff changeset
   217
HUCLASS(RKernelCopyAllocatorHelper) : public RAllocatorHelper
52
hgs
parents: 51
diff changeset
   218
    {
hgs
parents: 51
diff changeset
   219
public:
hgs
parents: 51
diff changeset
   220
    RKernelCopyAllocatorHelper();
hgs
parents: 51
diff changeset
   221
    TInt OpenCopiedHeap(DChunk* aOriginalChunk, DChunk* aCopiedChunk, TInt aOffset);
hgs
parents: 51
diff changeset
   222
    virtual DChunk* OpenUnderlyingChunk(); // Must be in CS
hgs
parents: 51
diff changeset
   223
    virtual void Close();
hgs
parents: 51
diff changeset
   224
hgs
parents: 51
diff changeset
   225
protected:
hgs
parents: 51
diff changeset
   226
    virtual TInt ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const;
hgs
parents: 51
diff changeset
   227
    virtual TInt WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize);
hgs
parents: 51
diff changeset
   228
    virtual TInt TryLock();
hgs
parents: 51
diff changeset
   229
    virtual void TryUnlock();
hgs
parents: 51
diff changeset
   230
private:
hgs
parents: 51
diff changeset
   231
    DChunk* iCopiedChunk;
hgs
parents: 51
diff changeset
   232
    TInt iOffset; // from the original kernel heap to the copied heap
hgs
parents: 51
diff changeset
   233
    };
51
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
#else
hgs
parents:
diff changeset
   236
54
hgs
parents: 52
diff changeset
   237
HUCLASS(RProxyAllocatorHelper) : public RAllocatorHelper
51
hgs
parents:
diff changeset
   238
	{
hgs
parents:
diff changeset
   239
public:
hgs
parents:
diff changeset
   240
	HUIMPORT_C RProxyAllocatorHelper();
hgs
parents:
diff changeset
   241
	HUIMPORT_C TInt Open(RMemoryAccess& aMem, TUint aThreadId);
hgs
parents:
diff changeset
   242
	HUIMPORT_C TInt OpenChunkHeap(RMemoryAccess& aMem, TAny* aDChunkPtr);
hgs
parents:
diff changeset
   243
	HUIMPORT_C virtual void Close();
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
protected:
hgs
parents:
diff changeset
   246
	virtual TInt ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const;
hgs
parents:
diff changeset
   247
	virtual TInt WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize);
hgs
parents:
diff changeset
   248
	virtual TInt TryLock();
hgs
parents:
diff changeset
   249
	virtual void TryUnlock();
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
private:
hgs
parents:
diff changeset
   252
	RMemoryAccess* iMemoryAccess;
hgs
parents:
diff changeset
   253
	TUint iThreadId;
hgs
parents:
diff changeset
   254
	};
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
#endif // __KERNEL_MODE__
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
	} // namespace LtkUtils
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
#endif