kernel/eka/include/heap_hybrid.h
author hgs
Mon, 01 Nov 2010 20:11:36 +0000
changeset 299 b5a01337d018
parent 189 a5496987b1da
permissions -rw-r--r--
201043_04
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
     1
// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
a5496987b1da 201025_04
hgs
parents:
diff changeset
     2
// All rights reserved.
a5496987b1da 201025_04
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
a5496987b1da 201025_04
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
a5496987b1da 201025_04
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
a5496987b1da 201025_04
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
a5496987b1da 201025_04
hgs
parents:
diff changeset
     7
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
     8
// Initial Contributors:
a5496987b1da 201025_04
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    10
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
    11
// Contributors:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    12
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
    13
// Description:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    14
// kernel\eka\include\heap_hybrid.h
a5496987b1da 201025_04
hgs
parents:
diff changeset
    15
// 
a5496987b1da 201025_04
hgs
parents:
diff changeset
    16
// Uses malloc (aka dlmalloc) written by Doug Lea version 2.8.4
a5496987b1da 201025_04
hgs
parents:
diff changeset
    17
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
    18
a5496987b1da 201025_04
hgs
parents:
diff changeset
    19
#ifndef __HEAP_HYBRID_H__
a5496987b1da 201025_04
hgs
parents:
diff changeset
    20
#define __HEAP_HYBRID_H__
a5496987b1da 201025_04
hgs
parents:
diff changeset
    21
a5496987b1da 201025_04
hgs
parents:
diff changeset
    22
#include <e32cmn.h>
a5496987b1da 201025_04
hgs
parents:
diff changeset
    23
a5496987b1da 201025_04
hgs
parents:
diff changeset
    24
#ifdef __WINS__
a5496987b1da 201025_04
hgs
parents:
diff changeset
    25
#define USE_HYBRID_HEAP 0
a5496987b1da 201025_04
hgs
parents:
diff changeset
    26
#else
a5496987b1da 201025_04
hgs
parents:
diff changeset
    27
#define USE_HYBRID_HEAP 1
a5496987b1da 201025_04
hgs
parents:
diff changeset
    28
#endif
a5496987b1da 201025_04
hgs
parents:
diff changeset
    29
a5496987b1da 201025_04
hgs
parents:
diff changeset
    30
// This stuff is all temporary in order to prevent having to include dla.h from heap_hybrid.h, which causes
a5496987b1da 201025_04
hgs
parents:
diff changeset
    31
// problems due to its definition of size_t (and possibly other types).  This is unfortunate but we cannot
a5496987b1da 201025_04
hgs
parents:
diff changeset
    32
// pollute the namespace with these types or it will cause problems with Open C and other POSIX compatibility
a5496987b1da 201025_04
hgs
parents:
diff changeset
    33
// efforts in Symbian
a5496987b1da 201025_04
hgs
parents:
diff changeset
    34
a5496987b1da 201025_04
hgs
parents:
diff changeset
    35
#define NSMALLBINS        (32U)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    36
#define NTREEBINS         (32U)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    37
a5496987b1da 201025_04
hgs
parents:
diff changeset
    38
#ifndef MALLOC_ALIGNMENT
a5496987b1da 201025_04
hgs
parents:
diff changeset
    39
	#define MALLOC_ALIGNMENT ((TUint)8U)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    40
#endif  /* MALLOC_ALIGNMENT */
a5496987b1da 201025_04
hgs
parents:
diff changeset
    41
a5496987b1da 201025_04
hgs
parents:
diff changeset
    42
#define CHUNK_OVERHEAD      (sizeof(TUint))
a5496987b1da 201025_04
hgs
parents:
diff changeset
    43
a5496987b1da 201025_04
hgs
parents:
diff changeset
    44
typedef unsigned int bindex_t;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    45
typedef unsigned int binmap_t;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    46
typedef struct malloc_chunk* mchunkptr;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    47
typedef struct malloc_segment msegment;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    48
typedef struct malloc_state* mstate;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    49
typedef struct malloc_tree_chunk* tbinptr;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    50
typedef struct malloc_tree_chunk* tchunkptr;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    51
a5496987b1da 201025_04
hgs
parents:
diff changeset
    52
struct malloc_segment {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    53
  TUint8*        iBase;             /* base address */
a5496987b1da 201025_04
hgs
parents:
diff changeset
    54
  TUint       iSize;             /* allocated size */
a5496987b1da 201025_04
hgs
parents:
diff changeset
    55
};
a5496987b1da 201025_04
hgs
parents:
diff changeset
    56
a5496987b1da 201025_04
hgs
parents:
diff changeset
    57
struct malloc_state {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    58
	binmap_t	 iSmallMap;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    59
	binmap_t	 iTreeMap;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    60
	TUint		 iDvSize;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    61
	TUint		 iTopSize;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    62
	mchunkptr	iDv;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    63
	mchunkptr	iTop;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    64
	TUint		 iTrimCheck;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    65
	mchunkptr	iSmallBins[(NSMALLBINS+1)*2];
a5496987b1da 201025_04
hgs
parents:
diff changeset
    66
	tbinptr		iTreeBins[NTREEBINS];
a5496987b1da 201025_04
hgs
parents:
diff changeset
    67
	msegment	iSeg;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    68
	};
a5496987b1da 201025_04
hgs
parents:
diff changeset
    69
a5496987b1da 201025_04
hgs
parents:
diff changeset
    70
class RHybridHeap : public RHeap
a5496987b1da 201025_04
hgs
parents:
diff changeset
    71
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    72
a5496987b1da 201025_04
hgs
parents:
diff changeset
    73
public:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    74
a5496987b1da 201025_04
hgs
parents:
diff changeset
    75
	struct HeapInfo
a5496987b1da 201025_04
hgs
parents:
diff changeset
    76
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    77
	    unsigned iFootprint;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    78
	    unsigned iMaxSize;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    79
	    unsigned iAllocBytes;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    80
	    unsigned iAllocN;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    81
	    unsigned iFreeBytes;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    82
	    unsigned iFreeN;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    83
		};
a5496987b1da 201025_04
hgs
parents:
diff changeset
    84
a5496987b1da 201025_04
hgs
parents:
diff changeset
    85
	struct SHeapCellInfo { RHybridHeap* iHeap; TInt iTotalAlloc;	TInt iTotalAllocSize; TInt iTotalFree; TInt iLevelAlloc; SDebugCell* iStranded; };
a5496987b1da 201025_04
hgs
parents:
diff changeset
    86
a5496987b1da 201025_04
hgs
parents:
diff changeset
    87
a5496987b1da 201025_04
hgs
parents:
diff changeset
    88
	/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
    89
    @internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
    90
    */
a5496987b1da 201025_04
hgs
parents:
diff changeset
    91
	enum TAllocatorType
a5496987b1da 201025_04
hgs
parents:
diff changeset
    92
			{ESlabAllocator, EDougLeaAllocator, EPageAllocator, EFullSlab=0x80, EPartialFullSlab=0x40, EEmptySlab=0x20, ESlabSpare=0x10, ESlabMask=0xf0};
a5496987b1da 201025_04
hgs
parents:
diff changeset
    93
a5496987b1da 201025_04
hgs
parents:
diff changeset
    94
a5496987b1da 201025_04
hgs
parents:
diff changeset
    95
	/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
    96
    @internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
    97
    */
a5496987b1da 201025_04
hgs
parents:
diff changeset
    98
	struct SWalkInfo {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    99
					  /**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   100
	                  Walk function address shall be called
a5496987b1da 201025_04
hgs
parents:
diff changeset
   101
	                  */
a5496987b1da 201025_04
hgs
parents:
diff changeset
   102
		TWalkFunc iFunction;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   103
a5496987b1da 201025_04
hgs
parents:
diff changeset
   104
					  /**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   105
	                  The first parameter for callback function
a5496987b1da 201025_04
hgs
parents:
diff changeset
   106
	                  */
a5496987b1da 201025_04
hgs
parents:
diff changeset
   107
		TAny*        iParam;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   108
					  /**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   109
	                  Pointer to RHybridHeap object
a5496987b1da 201025_04
hgs
parents:
diff changeset
   110
	                  */
a5496987b1da 201025_04
hgs
parents:
diff changeset
   111
		RHybridHeap* iHeap;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   112
		};
a5496987b1da 201025_04
hgs
parents:
diff changeset
   113
a5496987b1da 201025_04
hgs
parents:
diff changeset
   114
	/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   115
    @internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   116
    */
a5496987b1da 201025_04
hgs
parents:
diff changeset
   117
	struct SConfig {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   118
					  /**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   119
	                  Required slab configuration ( bit 0=4, bit 1=8 ..
a5496987b1da 201025_04
hgs
parents:
diff changeset
   120
	                  bit 13 = 56)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   121
	                  */
a5496987b1da 201025_04
hgs
parents:
diff changeset
   122
		TUint32 iSlabBits;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   123
					  /**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   124
	                  Delayed slab threshold in bytes (0 = no threshold)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   125
	                  */
a5496987b1da 201025_04
hgs
parents:
diff changeset
   126
		TInt   iDelayedSlabThreshold;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   127
					  /**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   128
	                  2^n is smallest size allocated in paged allocator (14-31 = 16 Kb --> )
a5496987b1da 201025_04
hgs
parents:
diff changeset
   129
	                  */
a5496987b1da 201025_04
hgs
parents:
diff changeset
   130
		TInt   iPagePower;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   131
a5496987b1da 201025_04
hgs
parents:
diff changeset
   132
		};
a5496987b1da 201025_04
hgs
parents:
diff changeset
   133
a5496987b1da 201025_04
hgs
parents:
diff changeset
   134
	/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   135
	@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   136
a5496987b1da 201025_04
hgs
parents:
diff changeset
   137
	This structure is used by test code for configuring the allocators and obtaining information
a5496987b1da 201025_04
hgs
parents:
diff changeset
   138
	from them in order to ensure they are behaving as required.  This is internal test specific
a5496987b1da 201025_04
hgs
parents:
diff changeset
   139
	code and is liable to be changed without warning at any time.  You should under no circumstances
a5496987b1da 201025_04
hgs
parents:
diff changeset
   140
	be using it!
a5496987b1da 201025_04
hgs
parents:
diff changeset
   141
	*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   142
	struct STestCommand
a5496987b1da 201025_04
hgs
parents:
diff changeset
   143
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   144
		TInt	iCommand;			// The test related command to be executed
a5496987b1da 201025_04
hgs
parents:
diff changeset
   145
a5496987b1da 201025_04
hgs
parents:
diff changeset
   146
		union
a5496987b1da 201025_04
hgs
parents:
diff changeset
   147
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   148
			SConfig		iConfig;	// Configuration used by test code only
a5496987b1da 201025_04
hgs
parents:
diff changeset
   149
			TAny*		iData;		// Extra supporting data for the test command
a5496987b1da 201025_04
hgs
parents:
diff changeset
   150
			};
a5496987b1da 201025_04
hgs
parents:
diff changeset
   151
		};
a5496987b1da 201025_04
hgs
parents:
diff changeset
   152
a5496987b1da 201025_04
hgs
parents:
diff changeset
   153
	/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   154
	@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   155
a5496987b1da 201025_04
hgs
parents:
diff changeset
   156
	Commands used by test code for configuring the allocators and obtaining information them them
a5496987b1da 201025_04
hgs
parents:
diff changeset
   157
	*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   158
	enum TTestCommand { EGetConfig, ESetConfig, EHeapMetaData, ETestData };
a5496987b1da 201025_04
hgs
parents:
diff changeset
   159
a5496987b1da 201025_04
hgs
parents:
diff changeset
   160
	virtual TAny* Alloc(TInt aSize);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   161
	virtual void Free(TAny* aPtr);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   162
	virtual TAny* ReAlloc(TAny* aPtr, TInt aSize, TInt aMode=0);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   163
	virtual TInt AllocLen(const TAny* aCell) const;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   164
#ifndef __KERNEL_MODE__	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   165
	virtual TInt Compress();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   166
	virtual void Reset();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   167
	virtual TInt AllocSize(TInt& aTotalAllocSize) const;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   168
	virtual TInt Available(TInt& aBiggestBlock) const;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   169
#endif	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   170
	virtual TInt DebugFunction(TInt aFunc, TAny* a1=NULL, TAny* a2=NULL);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   171
protected:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   172
	virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   173
a5496987b1da 201025_04
hgs
parents:
diff changeset
   174
public:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   175
	TAny* operator new(TUint aSize, TAny* aBase) __NO_THROW;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   176
	void operator delete(TAny*, TAny*);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   177
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   178
private:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   179
	TInt DoCountAllocFree(TInt& aFree);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   180
	TInt DoCheckHeap(SCheckInfo* aInfo);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   181
	void DoMarkStart();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   182
	TUint32 DoMarkEnd(TInt aExpected);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   183
	void DoSetAllocFail(TAllocFail aType, TInt aRate);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   184
	TBool CheckForSimulatedAllocFail();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   185
	void DoSetAllocFail(TAllocFail aType, TInt aRate, TUint aBurst);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   186
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   187
	void Lock() const;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   188
	void Unlock() const;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   189
	TInt ChunkHandle() const;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   190
a5496987b1da 201025_04
hgs
parents:
diff changeset
   191
	RHybridHeap(TInt aChunkHandle, TInt aOffset, TInt aMinLength, TInt aMaxLength, TInt aGrowBy, TInt aAlign, TBool aSingleThread, TBool aDlOnly, TBool aUseAdjust);	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   192
	RHybridHeap(TInt aMaxLength, TInt aAlign=0, TBool aSingleThread=ETrue);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   193
	RHybridHeap();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   194
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   195
	void Init(TInt aBitmapSlab, TInt aPagePower);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   196
	inline void InitBins(mstate m);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   197
	inline void InitTop(mstate m, mchunkptr p, TUint psize);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   198
    void* SysAlloc(mstate m, TUint nb);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   199
	int SysTrim(mstate m, TUint pad);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   200
	void* TmallocLarge(mstate m, TUint nb);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   201
	void* TmallocSmall(mstate m, TUint nb);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   202
	/*MACROS converted functions*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   203
	static inline void UnlinkFirstSmallChunk(mstate M,mchunkptr B,mchunkptr P,bindex_t& I);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   204
	static inline void InsertSmallChunk(mstate M,mchunkptr P, TUint S);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   205
	static inline void InsertChunk(mstate M,mchunkptr P,TUint S);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   206
	static inline void UnlinkLargeChunk(mstate M,tchunkptr X);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   207
	static inline void UnlinkSmallChunk(mstate M, mchunkptr P,TUint S);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   208
	static inline void UnlinkChunk(mstate M, mchunkptr P, TUint S);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   209
	static inline void ComputeTreeIndex(TUint S, bindex_t& I);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   210
	static inline void InsertLargeChunk(mstate M,tchunkptr X,TUint S);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   211
	static inline void ReplaceDv(mstate M, mchunkptr P, TUint S);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   212
	static inline void ComputeBit2idx(binmap_t X,bindex_t& I);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   213
a5496987b1da 201025_04
hgs
parents:
diff changeset
   214
	void DoComputeTreeIndex(TUint S, bindex_t& I);	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   215
	void DoCheckAnyChunk(mstate m, mchunkptr p);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   216
	void DoCheckTopChunk(mstate m, mchunkptr p);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   217
	void DoCheckInuseChunk(mstate m, mchunkptr p);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   218
	void DoCheckFreeChunk(mstate m, mchunkptr p);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   219
	void DoCheckMallocedChunk(mstate m, void* mem, TUint s);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   220
	void DoCheckTree(mstate m, tchunkptr t);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   221
	void DoCheckTreebin(mstate m, bindex_t i);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   222
	void DoCheckSmallbin(mstate m, bindex_t i);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   223
	TInt BinFind(mstate m, mchunkptr x);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   224
	TUint TraverseAndCheck(mstate m);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   225
	void DoCheckMallocState(mstate m);	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   226
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   227
	TInt GetInfo(struct HeapInfo* i, SWalkInfo* wi=NULL) const;	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   228
	void InitDlMalloc(TUint capacity, int locked);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   229
	void* DlMalloc(TUint);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   230
	void  DlFree(void*);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   231
	void* DlRealloc(void*, TUint, TInt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   232
	TUint DlInfo(struct HeapInfo* i, SWalkInfo* wi) const;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   233
	void DoCheckCommittedSize(TInt aNPages, mstate aM);	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   234
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   235
	TAny* ReAllocImpl(TAny* aPtr, TInt aSize, TInt aMode);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   236
	void Construct(TBool aSingleThread, TBool aDLOnly, TBool aUseAdjust, TInt aAlign);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   237
#ifndef __KERNEL_MODE__	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   238
	TInt ConstructLock(TUint32 aMode);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   239
#endif	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   240
	static void Walk(SWalkInfo* aInfo, TAny* aBfr, TInt aLth, TCellType aBfrType, TAllocatorType aAlloctorType);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   241
	static void WalkCheckCell(TAny* aPtr, TCellType aType, TAny* aCell, TInt aLen);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   242
	void* Map(void* p, TInt sz);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   243
	void Unmap(void* p,TInt sz);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   244
a5496987b1da 201025_04
hgs
parents:
diff changeset
   245
private:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   246
	TInt iMinLength;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   247
	TInt iOffset;				// offset of RHeap object from chunk base
a5496987b1da 201025_04
hgs
parents:
diff changeset
   248
	TInt iGrowBy;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   249
	TInt iMinCell;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   250
	TInt iPageSize;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   251
a5496987b1da 201025_04
hgs
parents:
diff changeset
   252
	// Temporarily commented out and exported from RHeap to prevent source breaks from req417-52840.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   253
	// This will be moved with another REQ after submission and subsequent fixing of bad code
a5496987b1da 201025_04
hgs
parents:
diff changeset
   254
	//TInt iNestingLevel;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   255
	TInt iAllocCount;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   256
	// Temporarily commented out.  See comment above regarding req417-52840 source breaks
a5496987b1da 201025_04
hgs
parents:
diff changeset
   257
	//TAllocFail iFailType;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   258
	TInt iFailRate;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   259
	TBool iFailed;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   260
	TInt iFailAllocCount;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   261
	TInt iRand;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   262
	// Temporarily commented out.  See comment above regarding req417-52840 source breaks
a5496987b1da 201025_04
hgs
parents:
diff changeset
   263
	//TAny* iTestData;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   264
a5496987b1da 201025_04
hgs
parents:
diff changeset
   265
	TInt iChunkSize;				
a5496987b1da 201025_04
hgs
parents:
diff changeset
   266
	TInt iHighWaterMark;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   267
	TBool iUseAdjust;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   268
	TBool iDLOnly;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   269
a5496987b1da 201025_04
hgs
parents:
diff changeset
   270
	malloc_state iGlobalMallocState;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   271
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   272
#ifdef __KERNEL_MODE__
a5496987b1da 201025_04
hgs
parents:
diff changeset
   273
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   274
	friend class RHeapK;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   275
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   276
#else
a5496987b1da 201025_04
hgs
parents:
diff changeset
   277
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   278
	friend class UserHeap;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   279
	friend class HybridHeap;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   280
	friend class TestHybridHeap;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   281
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   282
private:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   283
a5496987b1da 201025_04
hgs
parents:
diff changeset
   284
	static void TreeRemove(slab* s);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   285
	static void TreeInsert(slab* s,slab** r);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   286
a5496987b1da 201025_04
hgs
parents:
diff changeset
   287
	enum {EOkBits = (1<<(MAXSLABSIZE>>2))-1};
a5496987b1da 201025_04
hgs
parents:
diff changeset
   288
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   289
	void SlabInit();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   290
	void SlabConfig(unsigned slabbitmap);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   291
	void* SlabAllocate(slabset& allocator);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   292
	void SlabFree(void* p);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   293
	void* AllocNewSlab(slabset& allocator);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   294
	void* AllocNewPage(slabset& allocator);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   295
	void* InitNewSlab(slabset& allocator, slab* s);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   296
	void FreeSlab(slab* s);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   297
	void FreePage(page* p);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   298
	void SlabInfo(struct HeapInfo* i, SWalkInfo* wi) const;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   299
	static void SlabFullInfo(slab* s, struct HeapInfo* i, SWalkInfo* wi);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   300
	static void SlabPartialInfo(slab* s, struct HeapInfo* i, SWalkInfo* wi);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   301
	static void SlabEmptyInfo(slab* s, struct HeapInfo* i, SWalkInfo* wi);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   302
	static void TreeWalk(slab* const* root, void (*f)(slab*, struct HeapInfo*, SWalkInfo*), struct HeapInfo* i, SWalkInfo* wi);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   303
a5496987b1da 201025_04
hgs
parents:
diff changeset
   304
	static void WalkPartialFullSlab(SWalkInfo* aInfo, slab* aSlab, TCellType aBfrType, TInt aLth);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   305
	static void WalkFullSlab(SWalkInfo* aInfo, slab* aSlab, TCellType aBfrType, TInt aLth);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   306
	void DoCheckSlab(slab* aSlab, TAllocatorType aSlabType, TAny* aBfr=NULL);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   307
	void DoCheckSlabTrees();	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   308
	void DoCheckSlabTree(slab** aS, TBool aPartialPage);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   309
	void BuildPartialSlabBitmap(TUint32* aBitmap, slab* aSlab, TAny* aBfr=NULL);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   310
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   311
	static inline unsigned SlabHeaderFree(unsigned h) 
a5496987b1da 201025_04
hgs
parents:
diff changeset
   312
	{return (h&0x000000ff);}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   313
	static inline unsigned SlabHeaderPagemap(unsigned h) 
a5496987b1da 201025_04
hgs
parents:
diff changeset
   314
	{return (h&0x00000f00)>>8;}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   315
	static inline unsigned SlabHeaderSize(unsigned h) 
a5496987b1da 201025_04
hgs
parents:
diff changeset
   316
	{return (h&0x0003f000)>>12;}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   317
	static inline unsigned SlabHeaderUsedm4(unsigned h) 
a5496987b1da 201025_04
hgs
parents:
diff changeset
   318
	{return (h&0x0ffc0000)>>18;}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   319
	/***paged allocator code***/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   320
	void PagedInit(TInt aPagePower);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   321
	void* PagedAllocate(unsigned size);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   322
	void PagedFree(void* p);	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   323
	void* PagedReallocate(void* p, unsigned size, TInt mode);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   324
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   325
	bool PagedEncode(unsigned pos, unsigned npage);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   326
	unsigned PagedDecode(unsigned pos) const;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   327
	inline unsigned PagedSize(void* p) const;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   328
	inline bool PagedSetSize(void* p, unsigned size);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   329
	inline void PagedZapSize(void* p, unsigned size);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   330
	inline void* Bitmap2addr(unsigned pos) const;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   331
	void PagedInfo(struct HeapInfo* i, SWalkInfo* wi) const;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   332
	void ResetBitmap();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   333
	TBool CheckBitmap(void* aBfr, TInt aSize, TUint32& aDummy, TInt& aNPages);	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   334
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   335
private:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   336
	paged_bitmap iPageMap;							// bitmap representing page allocator's pages
a5496987b1da 201025_04
hgs
parents:
diff changeset
   337
	TUint8*		iMemBase;							// bottom of paged/slab memory (chunk base)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   338
	TUint8		iBitMapBuffer[MAXSMALLPAGEBITS>>3];	// buffer for initial page bitmap
a5496987b1da 201025_04
hgs
parents:
diff changeset
   339
	TInt		iSlabThreshold;						// allocations < than this are done by the slab allocator
a5496987b1da 201025_04
hgs
parents:
diff changeset
   340
	TInt		iPageThreshold;						// 2^n is smallest cell size allocated in paged allocator
a5496987b1da 201025_04
hgs
parents:
diff changeset
   341
	TInt		iSlabInitThreshold;					// slab allocator will be used after chunk reaches this size
a5496987b1da 201025_04
hgs
parents:
diff changeset
   342
	TUint32		iSlabConfigBits;					// set of bits that specify which slab sizes to use
a5496987b1da 201025_04
hgs
parents:
diff changeset
   343
	slab*		iPartialPage;						// partial-use page tree
a5496987b1da 201025_04
hgs
parents:
diff changeset
   344
	slab*		iFullSlab;							// full slabs list (so we can find them when walking)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   345
	page*		iSparePage;							// cached, to avoid kernel exec calls for unmapping/remapping
a5496987b1da 201025_04
hgs
parents:
diff changeset
   346
	TUint8		iSizeMap[(MAXSLABSIZE>>2)+1];		// index of slabset indexes based on size class
a5496987b1da 201025_04
hgs
parents:
diff changeset
   347
	slabset		iSlabAlloc[MAXSLABSIZE>>2];			// array of pointers to slabsets
a5496987b1da 201025_04
hgs
parents:
diff changeset
   348
a5496987b1da 201025_04
hgs
parents:
diff changeset
   349
#endif // __KERNEL_MODE__	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   350
};
a5496987b1da 201025_04
hgs
parents:
diff changeset
   351
a5496987b1da 201025_04
hgs
parents:
diff changeset
   352
#define HEAP_ASSERT(x) __ASSERT_DEBUG(x, HEAP_PANIC(ETHeapBadCellAddress))
a5496987b1da 201025_04
hgs
parents:
diff changeset
   353
a5496987b1da 201025_04
hgs
parents:
diff changeset
   354
template <class T> inline T Floor(const T addr, unsigned aln)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   355
{return T((unsigned(addr))&~(aln-1));}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   356
template <class T> inline T Ceiling(T addr, unsigned aln)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   357
{return T((unsigned(addr)+(aln-1))&~(aln-1));}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   358
template <class T> inline unsigned LowBits(T addr, unsigned aln)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   359
{return unsigned(addr)&(aln-1);}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   360
template <class T1, class T2> inline int PtrDiff(const T1* a1, const T2* a2)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   361
{return reinterpret_cast<const unsigned char*>(a1) - reinterpret_cast<const unsigned char*>(a2);}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   362
template <class T> inline T Offset(T addr, unsigned ofs)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   363
{return T(unsigned(addr)+ofs);}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   364
a5496987b1da 201025_04
hgs
parents:
diff changeset
   365
#endif //__HEAP_HYBRID_H__