perfsrv/memspy/Driver/Shared/heapoffsets.h
author hgs
Tue, 26 Oct 2010 16:20:32 +0300
changeset 62 1c2bb2fc7c87
permissions -rw-r--r--
201043
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62
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
// Contributors:
hgs
parents:
diff changeset
    13
// Adrian Issott (Nokia) - Updates for RHybridHeap v2
hgs
parents:
diff changeset
    14
//
hgs
parents:
diff changeset
    15
hgs
parents:
diff changeset
    16
#ifndef FSHELL_HEAP_OFFSETS_H
hgs
parents:
diff changeset
    17
#define FSHELL_HEAP_OFFSETS_H
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include <e32def.h>
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#if defined(TEST_HYBRIDHEAP_V1_ASSERTS) || defined(TEST_HYBRIDHEAP_V2_ASSERTS)
hgs
parents:
diff changeset
    22
#define TEST_HYBRIDHEAP_COMMON_ASSERTS
hgs
parents:
diff changeset
    23
#endif
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#ifdef TEST_HYBRIDHEAP_COMMON_ASSERTS
hgs
parents:
diff changeset
    26
#define private public
hgs
parents:
diff changeset
    27
#include <e32def.h>
hgs
parents:
diff changeset
    28
#endif 
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
#ifdef TEST_HYBRIDHEAP_V2_ASSERTS
hgs
parents:
diff changeset
    31
#include <e32panic.h>
hgs
parents:
diff changeset
    32
#include <kernel/heap_hybrid.h>
hgs
parents:
diff changeset
    33
#include "common.h"
hgs
parents:
diff changeset
    34
#include "heap_priv_defs.h"
hgs
parents:
diff changeset
    35
#include "dla.h"
hgs
parents:
diff changeset
    36
#endif
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
#ifdef TEST_HYBRIDHEAP_COMMON_ASSERTS
hgs
parents:
diff changeset
    39
#include "slab.h"
hgs
parents:
diff changeset
    40
#include "page_alloc.h"
hgs
parents:
diff changeset
    41
#endif
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
#ifdef TEST_HYBRIDHEAP_V1_ASSERTS
hgs
parents:
diff changeset
    44
#include <kernel/heap_hybrid.h>
hgs
parents:
diff changeset
    45
#endif
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
/*
hgs
parents:
diff changeset
    49
 * This header provides offsets for use with three different types of heap algorithms:
hgs
parents:
diff changeset
    50
 * i) The original RHeap implemenation 
hgs
parents:
diff changeset
    51
 *    (RHeap v1)
hgs
parents:
diff changeset
    52
 * ii) The first RHybridHeap implemenation 
hgs
parents:
diff changeset
    53
 *    (RHeap v2 + RHybridHeap v1)
hgs
parents:
diff changeset
    54
 * iii) The second / refactored RHybridHeap implementation 
hgs
parents:
diff changeset
    55
 *      (RHeap v2 + RHybridHeap v2 + RDlAllocator + RPageAllocator + RSlabHeapAllocator)
hgs
parents:
diff changeset
    56
 */
hgs
parents:
diff changeset
    57
namespace LtkUtils
hgs
parents:
diff changeset
    58
	{
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
//
hgs
parents:
diff changeset
    61
// OFFSETS COMMON TO ALL THREE HEAP CLASSES
hgs
parents:
diff changeset
    62
// 
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
class RHackAllocator : public RAllocator
hgs
parents:
diff changeset
    65
    {
hgs
parents:
diff changeset
    66
public:
hgs
parents:
diff changeset
    67
    using RAllocator::iHandles;
hgs
parents:
diff changeset
    68
    using RAllocator::iTotalAllocSize;
hgs
parents:
diff changeset
    69
    using RAllocator::iCellCount;
hgs
parents:
diff changeset
    70
    };
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
class RHackHeap : public RHeap
hgs
parents:
diff changeset
    73
    {
hgs
parents:
diff changeset
    74
public:
hgs
parents:
diff changeset
    75
    // Careful, only allowed to use things that are in the same place for versions 1 and 2 of RHeap
hgs
parents:
diff changeset
    76
    using RHeap::iMaxLength;
hgs
parents:
diff changeset
    77
    using RHeap::iChunkHandle;
hgs
parents:
diff changeset
    78
    using RHeap::iLock;
hgs
parents:
diff changeset
    79
    using RHeap::iBase;
hgs
parents:
diff changeset
    80
    using RHeap::iAlign;
hgs
parents:
diff changeset
    81
    using RHeap::iTop;
hgs
parents:
diff changeset
    82
    };
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
const TInt KChunkSizeOffset = 30*4;
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
//
hgs
parents:
diff changeset
    87
// OFFSETS COMMON TO BOTH RHYBRIDHEAP CLASSES
hgs
parents:
diff changeset
    88
// 
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
namespace HeapV1
hgs
parents:
diff changeset
    91
    {
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
const TInt KUserInitialHeapMetaDataSize = 34*4;
hgs
parents:
diff changeset
    94
        
hgs
parents:
diff changeset
    95
    } // namespace HeapV1
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
//
hgs
parents:
diff changeset
    98
// OFFSETS COMMON TO BOTH RHYBRIDHEAP CLASSES
hgs
parents:
diff changeset
    99
// 
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
namespace HybridCom
hgs
parents:
diff changeset
   102
    {
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
const TInt KMallocStateTopSizeOffset = 3*4;
hgs
parents:
diff changeset
   105
const TInt KMallocStateTopOffset = 5*4;
hgs
parents:
diff changeset
   106
const TInt KMallocStateSegOffset = 105*4;
hgs
parents:
diff changeset
   107
const TInt KSlabParentOffset = 1*4;
hgs
parents:
diff changeset
   108
const TInt KSlabChild1Offset = 2*4;
hgs
parents:
diff changeset
   109
const TInt KSlabChild2Offset = 3*4;
hgs
parents:
diff changeset
   110
const TInt KSlabPayloadOffset = 4*4;
hgs
parents:
diff changeset
   111
const TInt KSlabsetSize = 4;
hgs
parents:
diff changeset
   112
//const TInt KDlOnlyOffset = 33*4;
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
#define MAXSLABSIZE     56
hgs
parents:
diff changeset
   115
#define SLABSHIFT       10
hgs
parents:
diff changeset
   116
#define SLABSIZE        (1 << SLABSHIFT)
hgs
parents:
diff changeset
   117
const TInt KMaxSlabPayload = SLABSIZE - KSlabPayloadOffset;
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
#ifdef TEST_HYBRIDHEAP_COMMON_ASSERTS
hgs
parents:
diff changeset
   120
__ASSERT_COMPILE(_FOFF(RHybridHeap, iChunkSize) == KChunkSizeOffset);
hgs
parents:
diff changeset
   121
__ASSERT_COMPILE(sizeof(malloc_state) == 107*4);
hgs
parents:
diff changeset
   122
#endif
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
    } // namespace HybridCom
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
//
hgs
parents:
diff changeset
   127
// OFFSETS SPECIFIC TO THE RHYBRIDHEAP V1 CLASSES
hgs
parents:
diff changeset
   128
// 
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
namespace HybridV1
hgs
parents:
diff changeset
   131
    {
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
const TInt KUserPageMapOffset = 141*4;
hgs
parents:
diff changeset
   134
const TInt KMallocStateOffset = 34*4; // same for user and kernel heaps
hgs
parents:
diff changeset
   135
const TInt KUserSparePageOffset = 167*4;
hgs
parents:
diff changeset
   136
const TInt KUserPartialPageOffset = 165*4;
hgs
parents:
diff changeset
   137
const TInt KUserFullSlabOffset = 166*4;
hgs
parents:
diff changeset
   138
const TInt KUserSlabAllocOffset = 172*4;
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
const TInt KUserInitialHeapMetaDataSize = 186*4;
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
__ASSERT_COMPILE(HeapV1::KUserInitialHeapMetaDataSize < KUserInitialHeapMetaDataSize);
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
#ifdef TEST_HYBRIDHEAP_V1_ASSERTS
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
const TInt KUserHybridHeapSize = KUserInitialHeapMetaDataSize;
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
#ifndef __KERNEL_MODE__
hgs
parents:
diff changeset
   149
__ASSERT_COMPILE(sizeof(RHybridHeap) == KUserHybridHeapSize);
hgs
parents:
diff changeset
   150
__ASSERT_COMPILE(_FOFF(RHybridHeap, iPageMap) == KUserPageMapOffset);
hgs
parents:
diff changeset
   151
__ASSERT_COMPILE(_FOFF(RHybridHeap, iSparePage) == KUserSparePageOffset);
hgs
parents:
diff changeset
   152
__ASSERT_COMPILE(_FOFF(RHybridHeap, iPartialPage) == KUserPartialPageOffset);
hgs
parents:
diff changeset
   153
__ASSERT_COMPILE(_FOFF(RHybridHeap, iSlabAlloc) == KUserSlabAllocOffset);
hgs
parents:
diff changeset
   154
__ASSERT_COMPILE(_FOFF(slab, iParent) == HybridCom::KSlabParentOffset);
hgs
parents:
diff changeset
   155
__ASSERT_COMPILE(_FOFF(slab, iChild1) == HybridCom::KSlabChild1Offset);
hgs
parents:
diff changeset
   156
__ASSERT_COMPILE(_FOFF(slab, iChild2) == HybridCom::KSlabChild2Offset);
hgs
parents:
diff changeset
   157
__ASSERT_COMPILE(_FOFF(slab, iPayload) == HybridCom::KSlabPayloadOffset);
hgs
parents:
diff changeset
   158
__ASSERT_COMPILE(sizeof(slabset) == HybridCom::KSlabsetSize);
hgs
parents:
diff changeset
   159
#endif
hgs
parents:
diff changeset
   160
__ASSERT_COMPILE(_FOFF(RHybridHeap, iGlobalMallocState) == KMallocStateOffset);
hgs
parents:
diff changeset
   161
__ASSERT_COMPILE(_FOFF(malloc_state, iTopSize) == HybridCom::KMallocStateTopSizeOffset);
hgs
parents:
diff changeset
   162
__ASSERT_COMPILE(_FOFF(malloc_state, iTop) == HybridCom::KMallocStateTopOffset);
hgs
parents:
diff changeset
   163
__ASSERT_COMPILE(_FOFF(malloc_state, iSeg) == HybridCom::KMallocStateSegOffset);
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
#endif
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
    } // namespace HybridV1
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
//
hgs
parents:
diff changeset
   170
// OFFSETS SPECIFIC TO THE RHYBRIDHEAP V2 CLASSES
hgs
parents:
diff changeset
   171
// 
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
namespace HybridV2
hgs
parents:
diff changeset
   174
    {
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
const TInt KUserPageMapOffset = 153*4;
hgs
parents:
diff changeset
   177
const TInt KUserMallocStateOffset = 45*4;
hgs
parents:
diff changeset
   178
const TInt KKernelMallocStateOffset = 37*4;
hgs
parents:
diff changeset
   179
const TInt KUserSparePageOffset = 175*4;
hgs
parents:
diff changeset
   180
const TInt KUserPartialPageOffset = 173*4;
hgs
parents:
diff changeset
   181
const TInt KUserFullSlabOffset = 174*4;
hgs
parents:
diff changeset
   182
const TInt KUserSlabAllocOffset = 180*4;
hgs
parents:
diff changeset
   183
const TInt KSelfReferenceOffset = 34*4; // same for user and kernel heaps
hgs
parents:
diff changeset
   184
const TInt KUserInitialHeapMetaDataSize = 194 * 4;
hgs
parents:
diff changeset
   185
const TInt KKernelInitialHeapMetaDataSize = 144 * 4;
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
__ASSERT_COMPILE(HeapV1::KUserInitialHeapMetaDataSize < KUserInitialHeapMetaDataSize);
hgs
parents:
diff changeset
   188
__ASSERT_COMPILE(HeapV1::KUserInitialHeapMetaDataSize < KKernelInitialHeapMetaDataSize);
hgs
parents:
diff changeset
   189
__ASSERT_COMPILE(KSelfReferenceOffset == HybridV1::KMallocStateOffset);
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
#ifdef TEST_HYBRIDHEAP_V2_ASSERTS
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
const TInt KUserHybridHeapSize = 44*4;
hgs
parents:
diff changeset
   194
const TInt KUserDlAllocatorOffset = KUserHybridHeapSize;
hgs
parents:
diff changeset
   195
const TInt KUserPageAllocatorOffset = 152 * 4;
hgs
parents:
diff changeset
   196
const TInt KUserSlabAllocatorOffset = 172 * 4;
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
const TInt KKernelHybridHeapSize = 36*4;
hgs
parents:
diff changeset
   199
const TInt KKernelDlAllocatorOffset = KKernelHybridHeapSize;
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
#ifndef __KERNEL_MODE__
hgs
parents:
diff changeset
   203
__ASSERT_COMPILE(sizeof(RHybridHeap) == KUserHybridHeapSize);
hgs
parents:
diff changeset
   204
__ASSERT_COMPILE(sizeof(RDlAllocator) == KUserPageAllocatorOffset - KUserDlAllocatorOffset);
hgs
parents:
diff changeset
   205
__ASSERT_COMPILE(_FOFF(RDlAllocator, iDlaState) == KUserMallocStateOffset - KUserHybridHeapSize);
hgs
parents:
diff changeset
   206
__ASSERT_COMPILE(sizeof(RPageAllocator) == KUserSlabAllocatorOffset - KUserPageAllocatorOffset);
hgs
parents:
diff changeset
   207
__ASSERT_COMPILE(sizeof(RSlabHeapAllocator) == KUserInitialHeapMetaDataSize - KUserSlabAllocatorOffset);
hgs
parents:
diff changeset
   208
__ASSERT_COMPILE(sizeof(RHybridHeap) + sizeof(RDlAllocator) + sizeof(RPageAllocator) + sizeof(RSlabHeapAllocator) == KUserInitialHeapMetaDataSize);
hgs
parents:
diff changeset
   209
__ASSERT_COMPILE(_FOFF(RPageAllocator, iPageMap) == KUserPageMapOffset - KUserPageAllocatorOffset);
hgs
parents:
diff changeset
   210
__ASSERT_COMPILE(_FOFF(RSlabHeapAllocator, iSparePage) == KUserSparePageOffset - KUserSlabAllocatorOffset);
hgs
parents:
diff changeset
   211
__ASSERT_COMPILE(_FOFF(RSlabHeapAllocator, iPartialPage) == KUserPartialPageOffset - KUserSlabAllocatorOffset);
hgs
parents:
diff changeset
   212
__ASSERT_COMPILE(_FOFF(RSlabHeapAllocator, iSlabAlloc) == KUserSlabAllocOffset - KUserSlabAllocatorOffset);
hgs
parents:
diff changeset
   213
__ASSERT_COMPILE(_FOFF(TSlab, iParent) == HybridCom::KSlabParentOffset);
hgs
parents:
diff changeset
   214
__ASSERT_COMPILE(_FOFF(TSlab, iChild1) == HybridCom::KSlabChild1Offset);
hgs
parents:
diff changeset
   215
__ASSERT_COMPILE(_FOFF(TSlab, iChild2) == HybridCom::KSlabChild2Offset);
hgs
parents:
diff changeset
   216
__ASSERT_COMPILE(_FOFF(TSlab, iPayload) == HybridCom::KSlabPayloadOffset);
hgs
parents:
diff changeset
   217
__ASSERT_COMPILE(sizeof(TSlabSet) == HybridCom::KSlabsetSize);
hgs
parents:
diff changeset
   218
#endif
hgs
parents:
diff changeset
   219
__ASSERT_COMPILE(sizeof(RHybridHeap) == KKernelHybridHeapSize);
hgs
parents:
diff changeset
   220
__ASSERT_COMPILE(_FOFF(RDlAllocator, iDlaState) == KKernelMallocStateOffset - KKernelHybridHeapSize);
hgs
parents:
diff changeset
   221
__ASSERT_COMPILE(_FOFF(malloc_state, topsize) == HybridCom::KMallocStateTopSizeOffset);
hgs
parents:
diff changeset
   222
__ASSERT_COMPILE(_FOFF(malloc_state, top) == HybridCom::KMallocStateTopOffset);
hgs
parents:
diff changeset
   223
__ASSERT_COMPILE(_FOFF(malloc_state, seg) == HybridCom::KMallocStateSegOffset);
hgs
parents:
diff changeset
   224
hgs
parents:
diff changeset
   225
#endif
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
    } // namespace HybridV2
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
	} // namespace LtkUtils
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
#endif // FSHELL_HEAP_OFFSETS_H