perfsrv/memspy/Driver/Kernel/Source/MemSpyDriverHeap.cpp
author hgs
Tue, 26 Oct 2010 16:20:32 +0300
changeset 62 1c2bb2fc7c87
parent 52 c2f44e33b468
permissions -rw-r--r--
201043
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* 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 "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
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "MemSpyDriverHeap.h"
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// System includes
hgs
parents:
diff changeset
    21
#include <kern_priv.h>
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
// User includes
hgs
parents:
diff changeset
    24
#include "MemSpyDriverOSAdaption.h"
hgs
parents:
diff changeset
    25
#include "MemSpyDriverUtils.h"
hgs
parents:
diff changeset
    26
#include "heaputils.h"
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
RMemSpyDriverRHeapBase::RMemSpyDriverRHeapBase()
hgs
parents:
diff changeset
    31
	: iHelper(NULL)
hgs
parents:
diff changeset
    32
    {
hgs
parents:
diff changeset
    33
    Reset();
hgs
parents:
diff changeset
    34
    }
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
LtkUtils::RAllocatorHelper* RMemSpyDriverRHeapBase::Helper()
hgs
parents:
diff changeset
    37
	{
hgs
parents:
diff changeset
    38
	return iHelper;
hgs
parents:
diff changeset
    39
	}
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
TMemSpyHeapInfo::THeapImplementationType RMemSpyDriverRHeapBase::GetTypeFromHelper() const
hgs
parents:
diff changeset
    42
	{
hgs
parents:
diff changeset
    43
	if (iHelper)
hgs
parents:
diff changeset
    44
		{
hgs
parents:
diff changeset
    45
		LtkUtils::RAllocatorHelper::TType type = iHelper->GetType();
hgs
parents:
diff changeset
    46
		switch (type)
hgs
parents:
diff changeset
    47
			{
hgs
parents:
diff changeset
    48
			case LtkUtils::RAllocatorHelper::ETypeRHeap:
hgs
parents:
diff changeset
    49
				return TMemSpyHeapInfo::ETypeRHeap;
hgs
parents:
diff changeset
    50
			case LtkUtils::RAllocatorHelper::ETypeRHybridHeap:
hgs
parents:
diff changeset
    51
				return TMemSpyHeapInfo::ETypeRHybridHeap;
62
hgs
parents: 52
diff changeset
    52
            case LtkUtils::RAllocatorHelper::ETypeRHybridHeapV2:
hgs
parents: 52
diff changeset
    53
                return TMemSpyHeapInfo::ETypeRHybridHeapV2;
hgs
parents: 52
diff changeset
    54
            case LtkUtils::RAllocatorHelper::ETypeUnknown:
51
hgs
parents:
diff changeset
    55
			default:
hgs
parents:
diff changeset
    56
				return TMemSpyHeapInfo::ETypeUnknown;
hgs
parents:
diff changeset
    57
			}
hgs
parents:
diff changeset
    58
		}
hgs
parents:
diff changeset
    59
	return TMemSpyHeapInfo::ETypeUnknown;
hgs
parents:
diff changeset
    60
	}
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
void RMemSpyDriverRHeapBase::Reset()
hgs
parents:
diff changeset
    63
    {
hgs
parents:
diff changeset
    64
	Close();
hgs
parents:
diff changeset
    65
	}
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
void RMemSpyDriverRHeapBase::Close()
hgs
parents:
diff changeset
    68
	{
hgs
parents:
diff changeset
    69
	if (iHelper)
hgs
parents:
diff changeset
    70
		{
hgs
parents:
diff changeset
    71
	    NKern::ThreadEnterCS();
hgs
parents:
diff changeset
    72
		iHelper->Close();
hgs
parents:
diff changeset
    73
		delete iHelper;
hgs
parents:
diff changeset
    74
		iHelper = NULL;
hgs
parents:
diff changeset
    75
		NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
    76
		}
hgs
parents:
diff changeset
    77
    }
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
void RMemSpyDriverRHeapBase::PrintInfo()
hgs
parents:
diff changeset
    80
    {
hgs
parents:
diff changeset
    81
	/* TOMSCI TODO replace with tracing based on latest struct info. See DMemSpyDriverLogChanHeapBase::PrintHeapInfo
hgs
parents:
diff changeset
    82
	 * Alternatively just call DMemSpyDriverLogChanHeapBase::PrintHeapInfo() somehow?
hgs
parents:
diff changeset
    83
	 
hgs
parents:
diff changeset
    84
#if defined(TRACE_TYPE_KERNELHEAP) || defined(TRACE_TYPE_USERHEAP)
hgs
parents:
diff changeset
    85
    Kern::Printf(" " );
hgs
parents:
diff changeset
    86
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RAllocator - iAccessCount:    0x%08x", iAccessCount );
hgs
parents:
diff changeset
    87
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RAllocator - iHandleCount:    0x%08x", iHandleCount );
hgs
parents:
diff changeset
    88
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RAllocator - iHandles:        0x%08x", iHandles );
hgs
parents:
diff changeset
    89
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RAllocator - iFlags:          0x%08x", iFlags );
hgs
parents:
diff changeset
    90
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RAllocator - iCellCount:      0x%08x", iCellCount );
hgs
parents:
diff changeset
    91
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RAllocator - iTotalAllocSize: 0x%08x", iTotalAllocSize );
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iMinLength:      0x%08x", iMinLength );
hgs
parents:
diff changeset
    94
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iMaxLength:      0x%08x", iMaxLength );
hgs
parents:
diff changeset
    95
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iOffset:         0x%08x", iOffset);
hgs
parents:
diff changeset
    96
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iGrowBy:         0x%08x", iGrowBy);
hgs
parents:
diff changeset
    97
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iChunkHandle:    0x%08x", iChunkHandle);
hgs
parents:
diff changeset
    98
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iBase:           0x%08x", Base());
hgs
parents:
diff changeset
    99
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iTop:            0x%08x", iTop );
hgs
parents:
diff changeset
   100
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iAlign:          0x%08x", iAlign);
hgs
parents:
diff changeset
   101
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iMinCell:        0x%08x", iMinCell);
hgs
parents:
diff changeset
   102
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iPageSize:       0x%08x", iPageSize);
hgs
parents:
diff changeset
   103
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iFree len:       0x%08x", iFree.len);
hgs
parents:
diff changeset
   104
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iFree next:      0x%08x", iFree.next);
hgs
parents:
diff changeset
   105
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iNestingLevel:   0x%08x", iNestingLevel);
hgs
parents:
diff changeset
   106
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      iAllocCount:     0x%08x", iAllocCount);
hgs
parents:
diff changeset
   107
    Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RHeap -      size:              %8d",  Size() );
hgs
parents:
diff changeset
   108
    Kern::Printf(" " );
hgs
parents:
diff changeset
   109
    Kern::Printf(" " );
hgs
parents:
diff changeset
   110
#endif
hgs
parents:
diff changeset
   111
	*/
hgs
parents:
diff changeset
   112
    }
hgs
parents:
diff changeset
   113
52
hgs
parents: 51
diff changeset
   114
hgs
parents: 51
diff changeset
   115
hgs
parents: 51
diff changeset
   116
hgs
parents: 51
diff changeset
   117
RMemSpyDriverRHeapUser::RMemSpyDriverRHeapUser( DMemSpyDriverOSAdaption& aOSAdaption )
hgs
parents: 51
diff changeset
   118
    : RMemSpyDriverRHeapBase(), iOSAdaption(aOSAdaption)
51
hgs
parents:
diff changeset
   119
    {
hgs
parents:
diff changeset
   120
    }
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
52
hgs
parents: 51
diff changeset
   123
TInt RMemSpyDriverRHeapUser::OpenUserHeap(DThread& aThread, TBool aEuserUdeb)
hgs
parents: 51
diff changeset
   124
    {
hgs
parents: 51
diff changeset
   125
    TLinAddr allocatorAddr = (TLinAddr)OSAdaption().DThread().GetAllocator(aThread);
hgs
parents: 51
diff changeset
   126
    NKern::ThreadEnterCS();
hgs
parents: 51
diff changeset
   127
    LtkUtils::RUserAllocatorHelper* helper = new LtkUtils::RUserAllocatorHelper;
hgs
parents: 51
diff changeset
   128
    if (!helper)
hgs
parents: 51
diff changeset
   129
        {
hgs
parents: 51
diff changeset
   130
        NKern::ThreadLeaveCS();
hgs
parents: 51
diff changeset
   131
        return KErrNoMemory;
hgs
parents: 51
diff changeset
   132
        }
hgs
parents: 51
diff changeset
   133
    TInt err = helper->OpenUserHeap(OSAdaption().DThread().GetId(aThread), allocatorAddr, aEuserUdeb);
hgs
parents: 51
diff changeset
   134
    if (!err)
hgs
parents: 51
diff changeset
   135
        {
hgs
parents: 51
diff changeset
   136
        iChunk = helper->OpenUnderlyingChunk();
hgs
parents: 51
diff changeset
   137
        if (!iChunk) err = KErrNotFound;
hgs
parents: 51
diff changeset
   138
        }
hgs
parents: 51
diff changeset
   139
    if (err)
hgs
parents: 51
diff changeset
   140
        {
hgs
parents: 51
diff changeset
   141
        delete helper;
hgs
parents: 51
diff changeset
   142
        }
hgs
parents: 51
diff changeset
   143
    else
hgs
parents: 51
diff changeset
   144
        {
hgs
parents: 51
diff changeset
   145
        iHelper = helper;
hgs
parents: 51
diff changeset
   146
        }
hgs
parents: 51
diff changeset
   147
    NKern::ThreadLeaveCS();
hgs
parents: 51
diff changeset
   148
    return err;
hgs
parents: 51
diff changeset
   149
    }
hgs
parents: 51
diff changeset
   150
hgs
parents: 51
diff changeset
   151
hgs
parents: 51
diff changeset
   152
RMemSpyDriverRHeapKernelFromCopy::RMemSpyDriverRHeapKernelFromCopy( DMemSpyDriverOSAdaption& aOSAdaption )
hgs
parents: 51
diff changeset
   153
:   iOSAdaption( aOSAdaption ), iChunk( NULL )
hgs
parents: 51
diff changeset
   154
    {
hgs
parents: 51
diff changeset
   155
    }
hgs
parents: 51
diff changeset
   156
hgs
parents: 51
diff changeset
   157
hgs
parents: 51
diff changeset
   158
void RMemSpyDriverRHeapKernelFromCopy::Reset()
51
hgs
parents:
diff changeset
   159
    {
hgs
parents:
diff changeset
   160
    RMemSpyDriverRHeapBase::Reset();
hgs
parents:
diff changeset
   161
	//
hgs
parents:
diff changeset
   162
    iChunk = NULL;
hgs
parents:
diff changeset
   163
    }
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
52
hgs
parents: 51
diff changeset
   166
TInt RMemSpyDriverRHeapKernelFromCopy::AssociateWithKernelChunk( DChunk* aKernelChunk, DChunk* aCopiedChunk, TLinAddr aCopiedChunkBase, TInt aOffset )
51
hgs
parents:
diff changeset
   167
    {
52
hgs
parents: 51
diff changeset
   168
    TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelFromCopy::AssociateWithKernelChunk() - START - aChunk: 0x%08x, aOffset: %d", 
hgs
parents: 51
diff changeset
   169
                            aCopiedChunk, aOffset) );
hgs
parents: 51
diff changeset
   170
hgs
parents: 51
diff changeset
   171
    iChunk = aCopiedChunk;
hgs
parents: 51
diff changeset
   172
    iChunkBase = aCopiedChunkBase;
51
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
    NKern::ThreadEnterCS();
52
hgs
parents: 51
diff changeset
   175
    TInt ret = KErrNone;
hgs
parents: 51
diff changeset
   176
    LtkUtils::RKernelCopyAllocatorHelper* helper = new LtkUtils::RKernelCopyAllocatorHelper();
hgs
parents: 51
diff changeset
   177
    if (helper)
51
hgs
parents:
diff changeset
   178
        {
52
hgs
parents: 51
diff changeset
   179
        helper->OpenCopiedHeap(aKernelChunk, aCopiedChunk, aOffset);
hgs
parents: 51
diff changeset
   180
        iHelper = helper;        
hgs
parents: 51
diff changeset
   181
        }
hgs
parents: 51
diff changeset
   182
    else
hgs
parents: 51
diff changeset
   183
        {
hgs
parents: 51
diff changeset
   184
        ret = KErrNoMemory;
51
hgs
parents:
diff changeset
   185
        }
hgs
parents:
diff changeset
   186
    NKern::ThreadLeaveCS();
52
hgs
parents: 51
diff changeset
   187
    
hgs
parents: 51
diff changeset
   188
    TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelFromCopy::AssociateWithKernelChunk() - END") );
hgs
parents: 51
diff changeset
   189
    return ret;
51
hgs
parents:
diff changeset
   190
    }
hgs
parents:
diff changeset
   191
52
hgs
parents: 51
diff changeset
   192
DChunk& RMemSpyDriverRHeapKernelFromCopy::Chunk()
51
hgs
parents:
diff changeset
   193
    {
hgs
parents:
diff changeset
   194
    return *iChunk;
hgs
parents:
diff changeset
   195
    }
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
52
hgs
parents: 51
diff changeset
   198
const DChunk& RMemSpyDriverRHeapKernelFromCopy::Chunk() const
51
hgs
parents:
diff changeset
   199
    {
52
hgs
parents: 51
diff changeset
   200
    return *iChunk;
51
hgs
parents:
diff changeset
   201
    }
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
void RMemSpyDriverRHeapKernelFromCopy::Close()
hgs
parents:
diff changeset
   204
	{
52
hgs
parents: 51
diff changeset
   205
    if  ( iChunk != NULL )
hgs
parents: 51
diff changeset
   206
        {
hgs
parents: 51
diff changeset
   207
        NKern::ThreadEnterCS();
hgs
parents: 51
diff changeset
   208
        Kern::ChunkClose( iChunk );
hgs
parents: 51
diff changeset
   209
        iChunk = NULL;
hgs
parents: 51
diff changeset
   210
        NKern::ThreadLeaveCS();
hgs
parents: 51
diff changeset
   211
        }
hgs
parents: 51
diff changeset
   212
    RMemSpyDriverRHeapBase::Close();
51
hgs
parents:
diff changeset
   213
	}
hgs
parents:
diff changeset
   214
52
hgs
parents: 51
diff changeset
   215
TBool RMemSpyDriverRHeapKernelFromCopy::IsOpen()
hgs
parents: 51
diff changeset
   216
    {
hgs
parents: 51
diff changeset
   217
    return (iChunk != NULL);
hgs
parents: 51
diff changeset
   218
    }
hgs
parents: 51
diff changeset
   219
hgs
parents: 51
diff changeset
   220
RMemSpyDriverRHeapKernelInPlace::RMemSpyDriverRHeapKernelInPlace( DMemSpyDriverOSAdaption& aOSAdaption )
hgs
parents: 51
diff changeset
   221
:   iOSAdaption( aOSAdaption ), iChunk( NULL )
51
hgs
parents:
diff changeset
   222
    {
hgs
parents:
diff changeset
   223
    }
hgs
parents:
diff changeset
   224
hgs
parents:
diff changeset
   225
TInt RMemSpyDriverRHeapKernelInPlace::OpenKernelHeap()
hgs
parents:
diff changeset
   226
	{
hgs
parents:
diff changeset
   227
	NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   228
	LtkUtils::RAllocatorHelper* helper = new LtkUtils::RAllocatorHelper;
hgs
parents:
diff changeset
   229
	if (!helper)
hgs
parents:
diff changeset
   230
		{
hgs
parents:
diff changeset
   231
		NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   232
		return KErrNoMemory;
hgs
parents:
diff changeset
   233
		}
hgs
parents:
diff changeset
   234
	TInt err = helper->OpenKernelHeap();
hgs
parents:
diff changeset
   235
	if (!err)
hgs
parents:
diff changeset
   236
		{
hgs
parents:
diff changeset
   237
		iChunk = helper->OpenUnderlyingChunk();
hgs
parents:
diff changeset
   238
		if (!iChunk) err = KErrNotFound;
hgs
parents:
diff changeset
   239
		}
hgs
parents:
diff changeset
   240
hgs
parents:
diff changeset
   241
	if (err)
hgs
parents:
diff changeset
   242
		{
hgs
parents:
diff changeset
   243
		delete helper;
hgs
parents:
diff changeset
   244
		}
hgs
parents:
diff changeset
   245
	else
hgs
parents:
diff changeset
   246
		{
hgs
parents:
diff changeset
   247
		iHelper = helper;
hgs
parents:
diff changeset
   248
		}
hgs
parents:
diff changeset
   249
	NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   250
	return err;
hgs
parents:
diff changeset
   251
	}
hgs
parents:
diff changeset
   252
hgs
parents:
diff changeset
   253
void RMemSpyDriverRHeapKernelInPlace::Close()
hgs
parents:
diff changeset
   254
    {
hgs
parents:
diff changeset
   255
	NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   256
	iChunk->Close(NULL);
hgs
parents:
diff changeset
   257
	iChunk = NULL;
hgs
parents:
diff changeset
   258
	RMemSpyDriverRHeapBase::Close();
hgs
parents:
diff changeset
   259
	NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   260
    }
hgs
parents:
diff changeset
   261
hgs
parents:
diff changeset
   262
DChunk& RMemSpyDriverRHeapKernelInPlace::Chunk()
hgs
parents:
diff changeset
   263
    {
hgs
parents:
diff changeset
   264
    return *iChunk;
hgs
parents:
diff changeset
   265
    }
hgs
parents:
diff changeset
   266
hgs
parents:
diff changeset
   267
hgs
parents:
diff changeset
   268
const DChunk& RMemSpyDriverRHeapKernelInPlace::Chunk() const
hgs
parents:
diff changeset
   269
    {
hgs
parents:
diff changeset
   270
    return *iChunk;
hgs
parents:
diff changeset
   271
    }
hgs
parents:
diff changeset
   272