class RHeap : public RAllocator |
Represents the default implementation for a heap.
The default implementation uses an address-ordered first fit type algorithm.
The heap itself is contained in a chunk and may be the only occupant of the chunk or may share the chunk with the program stack.
The class contains member functions for allocating, adjusting, freeing individual cells and generally managing the heap.
The class is not a handle in the same sense that RChunk is a handle; i.e. there is no Kernel object which corresponds to the heap.
Public Member Functions | |
---|---|
RHeap ( TInt , TInt , TBool ) | |
RHeap ( TInt , TInt , TInt , TInt , TInt , TInt , TBool ) | |
TInt | Align ( TInt ) |
const TAny * | Align (const TAny *) |
UIMPORT_C TAny * | Alloc ( TInt ) |
UIMPORT_C TInt | AllocLen (const TAny *) |
UIMPORT_C TInt | AllocSize ( TInt &) |
UIMPORT_C TInt | Available ( TInt &) |
TUint8 * | Base () |
TInt | ChunkHandle () |
UIMPORT_C TInt | Compress () |
UIMPORT_C TInt | DebugFunction ( TInt , TAny *, TAny *) |
UIMPORT_C void | Free ( TAny *) |
TBool | IsLastCell (const SCell *) |
void | Lock () |
TInt | MaxLength () |
UIMPORT_C TAny * | ReAlloc ( TAny *, TInt , TInt ) |
UIMPORT_C void | Reset () |
TInt | Size () |
void | Unlock () |
void | operator delete ( TAny *, TAny *) |
UIMPORT_C TAny * | operator new ( TUint , TAny *) |
Protected Member Functions | |
---|---|
RHeap () | |
void | CheckCell (const SCell *) |
TBool | CheckForSimulatedAllocFail () |
SCell * | DoAlloc ( TInt , SCell *&) |
TInt | DoCheckHeap ( SCheckInfo *) |
TInt | DoCountAllocFree ( TInt &) |
void | DoFree ( SCell *) |
TUint32 | DoMarkEnd ( TInt ) |
void | DoMarkStart () |
void | DoSetAllocFail ( TAllocFail , TInt ) |
void | DoSetAllocFail ( TAllocFail , TInt , TUint ) |
UIMPORT_C TInt | Extension_ ( TUint , TAny *&, TAny *) |
void | FindFollowingFreeCell ( SCell *, SCell *&, SCell *&) |
UIMPORT_C SCell * | GetAddress (const TAny *) |
void | Initialise () |
TAny * | ReAllocImpl ( TAny *, TInt , TInt ) |
TInt | Reduce ( SCell *) |
TInt | SetBrk ( TInt ) |
TInt | TryToGrowCell ( SCell *, SCell *, SCell *, TInt ) |
TInt | TryToGrowHeap ( TInt , SCell *) |
void | Walk ( TWalkFunc , TAny *) |
void | WalkCheckCell ( TAny *, TCellType , TAny *, TInt ) |
Public Member Enumerations | |
---|---|
enum |
TCellType
{
EGoodAllocatedCell , EGoodFreeCell , EBadAllocatedCellSize , EBadAllocatedCellAddress , EBadFreeCellAddress , EBadFreeCellSize } |
enum | TDebugHeapId { EUser = 0, EKernel = 1 } |
enum | TDebugOp { EWalk = 128 } |
enum | TDefaultShrinkRatios { EShrinkRatio1 = 256, EShrinkRatioDflt = 512 } |
Inherited Enumerations | |
---|---|
RAllocator:@10 | |
RAllocator:TAllocDebugOp | |
RAllocator:TAllocFail | |
RAllocator:TDbgHeapType | |
RAllocator:TFlags | |
RAllocator:TReAllocMode |
Public Member Type Definitions | |
---|---|
typedef | void(* TWalkFunc |
Protected Attributes | |
---|---|
TInt | iAlign |
TInt | iAllocCount |
TUint8 * | iBase |
TInt | iChunkHandle |
TInt | iFailAllocCount |
TInt | iFailRate |
TAllocFail | iFailType |
TBool | iFailed |
SCell | iFree |
TInt | iGrowBy |
RFastLock | iLock |
TInt | iMaxLength |
TInt | iMinCell |
TInt | iMinLength |
TInt | iNestingLevel |
TInt | iOffset |
TInt | iPageSize |
TInt | iRand |
TAny * | iTestData |
TUint8 * | iTop |
Inherited Attributes | |
---|---|
RAllocator::iAccessCount | |
RAllocator::iCellCount | |
RAllocator::iFlags | |
RAllocator::iHandleCount | |
RAllocator::iHandles | |
RAllocator::iTotalAllocSize |
UIMPORT_C | RHeap | ( | TInt | aMaxLength, |
TInt | aAlign = 0, | |||
TBool | aSingleThread = ETrue | |||
) |
UIMPORT_C | RHeap | ( | TInt | aChunkHandle, |
TInt | aOffset, | |||
TInt | aMinLength, | |||
TInt | aMaxLength, | |||
TInt | aGrowBy, | |||
TInt | aAlign = 0, | |||
TBool | aSingleThread = EFalse | |||
) |
UIMPORT_C TAny * | Alloc | ( | TInt | aSize | ) | [virtual] |
Allocates a cell of the specified size from the heap.
If there is insufficient memory available on the heap from which to allocate a cell of the required size, the function returns NULL.
The cell is aligned according to the alignment value specified at construction, or the default alignment value, if an explict value was not specified.
The resulting size of the allocated cell may be rounded up to a value greater than aSize, but is guaranteed to be not less than aSize.
TInt aSize | The size of the cell to be allocated from the heap |
UIMPORT_C TInt | AllocLen | ( | const TAny * | aCell | ) | const [virtual] |
Gets the length of the available space in the specified allocated cell.
const TAny * aCell | A pointer to the allocated cell. |
UIMPORT_C TInt | AllocSize | ( | TInt & | aTotalAllocSize | ) | const [virtual] |
Gets the number of cells allocated on this heap, and the total space allocated to them.
TInt & aTotalAllocSize | On return, contains the total space allocated to the cells. |
UIMPORT_C TInt | Available | ( | TInt & | aBiggestBlock | ) | const [virtual] |
Gets the total free space currently available on the heap and the space available in the largest free block.
The space available represents the total space which can be allocated.
Note that compressing the heap may reduce the total free space available and the space available in the largest free block.
TInt & aBiggestBlock | On return, contains the space available in the largest free block on the heap. |
TUint8 * | Base | ( | ) | const [inline] |
Gets a pointer to the start of the heap.
Note that because of the small space overhead incurred by all allocated cells, no cell will have the same address as that returned by this function.
void | CheckCell | ( | const SCell * | aCell | ) | const [protected] |
const SCell * aCell |
UIMPORT_C TInt | Compress | ( | ) | [virtual] |
Compresses the heap.
The function frees excess committed space from the top of the heap. The size of the heap is never reduced below the minimum size specified during creation of the heap.
UIMPORT_C TInt | DebugFunction | ( | TInt | aFunc, |
TAny * | a1 = NULL, | |||
TAny * | a2 = NULL | |||
) | [virtual] |
TInt | DoCheckHeap | ( | SCheckInfo * | aInfo | ) | [protected] |
SCheckInfo * aInfo |
void | DoSetAllocFail | ( | TAllocFail | aType, |
TInt | aRate | |||
) | [protected] |
TAllocFail aType | |
TInt aRate |
void | DoSetAllocFail | ( | TAllocFail | aType, |
TInt | aRate, | |||
TUint | aBurst | |||
) | [protected] |
TAllocFail aType | |
TInt aRate | |
TUint aBurst |
UIMPORT_C TInt | Extension_ | ( | TUint | aExtensionId, |
TAny *& | a0, | |||
TAny * | a1 | |||
) | [protected, virtual] |
void | FindFollowingFreeCell | ( | SCell * | aCell, |
SCell *& | pPrev, | |||
SCell *& | aNext | |||
) | [protected, inline] |
UIMPORT_C void | Free | ( | TAny * | aPtr | ) | [virtual] |
Frees the specified cell and returns it to the heap.
TAny * aPtr | A pointer to a valid cell; this pointer can also be NULL, in which case the function does nothing and just returns. |
UIMPORT_C SCell * | GetAddress | ( | const TAny * | aCell | ) | const [protected] |
const TAny * aCell |
TBool | IsLastCell | ( | const SCell * | aCell | ) | const [inline] |
const SCell * aCell |
UIMPORT_C TAny * | ReAlloc | ( | TAny * | aPtr, |
TInt | aSize, | |||
TInt | aMode = 0 | |||
) | [virtual] |
Increases or decreases the size of an existing cell in the heap.
If the cell is being decreased in size, then it is guaranteed not to move, and the function returns the pointer originally passed in aCell. Note that the length of the cell will be the same if the difference between the old size and the new size is smaller than the minimum cell size.
If the cell is being increased in size, i.e. aSize is bigger than its current size, then the function tries to grow the cell in place. If successful, then the function returns the pointer originally passed in aCell. If unsuccessful, then:
1. if the cell cannot be moved, i.e. aMode has the ENeverMove bit set, then the function returns NULL. 2. if the cell can be moved, i.e. aMode does not have the ENeverMove bit set, then the function tries to allocate a new replacement cell, and, if successful, returns a pointer to the new cell; if unsuccessful, it returns NULL.
Note that in debug mode, the function returns NULL if the cell cannot be grown in place, regardless of whether the ENeverMove bit is set.
If the reallocated cell is at a different location from the original cell, then the content of the original cell is copied to the reallocated cell.
If the supplied pointer, aCell is NULL, then the function attempts to allocate a new cell, but only if the cell can be moved, i.e. aMode does not have the ENeverMove bit set.
Note the following general points:
1. If reallocation fails, the content of the original cell is preserved.
2. The resulting size of the re-allocated cell may be rounded up to a value greater than aSize, but is guaranteed to be not less than aSize.
TAny * aPtr | A pointer to the cell to be reallocated. This may be NULL. |
TInt aSize | The new size of the cell. This may be bigger or smaller than the size of the original cell. |
TInt aMode = 0 | Flags controlling the reallocation. The only bit which has any effect on this function is that defined by the enumeration ENeverMove of the enum RAllocator::TReAllocMode. If this is set, then any successful reallocation guarantees not to have changed the start address of the cell. By default, this parameter is zero. |
TAny * | ReAllocImpl | ( | TAny * | aPtr, |
TInt | aSize, | |||
TInt | aMode | |||
) | [protected, inline] |
TInt | Size | ( | ) | const [inline] |
Gets the current size of the heap.
This is the total number of bytes committed by the host chunk. It is the requested size rounded up by page size minus the size of RHeap object(116 bytes) minus the cell alignment overhead as shown:
Size = (Rounded committed size - Size of RHeap - Cell Alignment Overhead).
The cell alignment overhead varies between release builds and debug builds.
Note that this value is always greater than the total space available across all allocated cells.
Rheap::Available( )
TInt | TryToGrowCell | ( | SCell * | pC, |
SCell * | pP, | |||
SCell * | pE, | |||
TInt | aSize | |||
) | [protected] |
void | WalkCheckCell | ( | TAny * | aPtr, |
TCellType | aType, | |||
TAny * | aCell, | |||
TInt | aLen | |||
) | [protected, static] |
void | operator delete | ( | TAny * | aPtr, |
TAny * | aBase | |||
) | [inline] |
Called if constructor issued by operator new(TUint aSize, TAny* aBase) throws exception. This is dummy as corresponding new operator does not allocate memory.
EGoodAllocatedCell | |
EGoodFreeCell | |
EBadAllocatedCellSize | |
EBadAllocatedCellAddress | |
EBadFreeCellAddress | |
EBadFreeCellSize |
EUser = 0 |
The heap is a user heap. |
EKernel = 1 |
The heap is the Kernel heap. |
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.