perfsrv/memspy/Driver/User/Source/MemSpyDriverClient.cpp
author hgs
Mon, 06 Sep 2010 15:00:47 +0300
changeset 51 98307c651589
child 52 c2f44e33b468
permissions -rw-r--r--
201035
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 <memspy/driver/memspydriverclient.h>
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// System includes
hgs
parents:
diff changeset
    21
#include <e32svr.h>
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
// User includes
hgs
parents:
diff changeset
    24
#include "MemSpyDriverOpCodes.h"
hgs
parents:
diff changeset
    25
#include <memspy/driver/memspydriverconstants.h>
hgs
parents:
diff changeset
    26
#include <memspy/driver/memspydriverobjectsshared.h>
hgs
parents:
diff changeset
    27
#include "MemSpyDriverStreamReaderImp.h"
hgs
parents:
diff changeset
    28
#include "MemSpyDriverObjectsInternal.h"
hgs
parents:
diff changeset
    29
#include "heaputils.h"
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
// Constants
hgs
parents:
diff changeset
    32
const TInt KMemSpyClientBufferGrowSize = 0x1000 * 8; // 32kb
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
// Forward declarations
hgs
parents:
diff changeset
    35
static void PrintHeapInfo( const TMemSpyHeapInfo& aInfo );
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
EXPORT_C TInt RMemSpyDriverClient::Open()
hgs
parents:
diff changeset
    41
	{
hgs
parents:
diff changeset
    42
    TInt err = iBuffer.Create( KMemSpyClientBufferGrowSize );
hgs
parents:
diff changeset
    43
    if  ( err == KErrNone )
hgs
parents:
diff changeset
    44
        {
hgs
parents:
diff changeset
    45
        err = User::LoadLogicalDevice( KMemSpyDriverDeviceName );
hgs
parents:
diff changeset
    46
        if  ( err == KErrNone || err == KErrAlreadyExists )
hgs
parents:
diff changeset
    47
		    {
hgs
parents:
diff changeset
    48
		    err = DoCreate( KMemSpyDriverDeviceName, KMemSpyDriverVersion(), KNullUnit, NULL, NULL, EOwnerThread );
hgs
parents:
diff changeset
    49
            if  ( err == KErrNone )
hgs
parents:
diff changeset
    50
                {
hgs
parents:
diff changeset
    51
                TUint heapVTable = RHeapVTable();
hgs
parents:
diff changeset
    52
 	            err = DoControl( EMemSpyDriverOpCodeMiscSetRHeapVTable, (TAny*) heapVTable );
hgs
parents:
diff changeset
    53
                }
hgs
parents:
diff changeset
    54
		    }
hgs
parents:
diff changeset
    55
        }
hgs
parents:
diff changeset
    56
    //
hgs
parents:
diff changeset
    57
    if ( err != KErrNone )
hgs
parents:
diff changeset
    58
        {
hgs
parents:
diff changeset
    59
        RDebug::Printf( "[MemSpy] RMemSpyDriverClient::Open() - END - err: %d", err );
hgs
parents:
diff changeset
    60
        }
hgs
parents:
diff changeset
    61
    //
hgs
parents:
diff changeset
    62
	return err;
hgs
parents:
diff changeset
    63
	}
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
EXPORT_C void RMemSpyDriverClient::Close()
hgs
parents:
diff changeset
    68
	{
hgs
parents:
diff changeset
    69
    RBusLogicalChannel::Close();
hgs
parents:
diff changeset
    70
    const TInt err = User::FreeLogicalDevice( KMemSpyDriverDeviceName );
hgs
parents:
diff changeset
    71
    //
hgs
parents:
diff changeset
    72
    if ( err != KErrNone )
hgs
parents:
diff changeset
    73
        {
hgs
parents:
diff changeset
    74
        RDebug::Printf( "[MemSpy] RMemSpyDriverClient::Close() - free logical device error: %d", err );
hgs
parents:
diff changeset
    75
        }
hgs
parents:
diff changeset
    76
    //
hgs
parents:
diff changeset
    77
    iBuffer.Close();
hgs
parents:
diff changeset
    78
    (void) err;
hgs
parents:
diff changeset
    79
	}
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
EXPORT_C void RMemSpyDriverClient::GetVersion( TVersion& aVersion )
hgs
parents:
diff changeset
    83
    {
hgs
parents:
diff changeset
    84
    TVersion v = KMemSpyDriverVersion();
hgs
parents:
diff changeset
    85
    Mem::Copy( (TAny*)&aVersion, (TAny*)&v, sizeof( TVersion ) );
hgs
parents:
diff changeset
    86
    }
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
EXPORT_C TInt RMemSpyDriverClient::ReadMemory( TUint aTid, TLinAddr aSrc, TDes8& aDest )
hgs
parents:
diff changeset
   107
	{
hgs
parents:
diff changeset
   108
	TMemSpyDriverInternalReadMemParams params;
hgs
parents:
diff changeset
   109
	params.iTid = aTid;
hgs
parents:
diff changeset
   110
	params.iAddr = aSrc;
hgs
parents:
diff changeset
   111
	params.iDes = &aDest;
hgs
parents:
diff changeset
   112
    aDest.Zero();
hgs
parents:
diff changeset
   113
    //
hgs
parents:
diff changeset
   114
	TInt r = DoControl( EMemSpyDriverOpCodeRawMemoryRead, &params, NULL );
hgs
parents:
diff changeset
   115
    if  ( r >= KErrNone )
hgs
parents:
diff changeset
   116
        {
hgs
parents:
diff changeset
   117
        aDest.SetLength( r );
hgs
parents:
diff changeset
   118
        r = KErrNone;
hgs
parents:
diff changeset
   119
        }
hgs
parents:
diff changeset
   120
    //
hgs
parents:
diff changeset
   121
    return r;
hgs
parents:
diff changeset
   122
    }
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
EXPORT_C TInt RMemSpyDriverClient::GetCodeSegs( TAny** aHandleArray, TInt& aHandleCount, TBool aOnlyRamLoaded )
hgs
parents:
diff changeset
   138
    {
hgs
parents:
diff changeset
   139
	TMemSpyDriverInternalCodeSnapshotParams params;
hgs
parents:
diff changeset
   140
	params.iFilter = aOnlyRamLoaded;
hgs
parents:
diff changeset
   141
	params.iHandles = aHandleArray;
hgs
parents:
diff changeset
   142
	params.iCountPtr = &aHandleCount;
hgs
parents:
diff changeset
   143
	params.iMaxCount = aHandleCount;
hgs
parents:
diff changeset
   144
    //
hgs
parents:
diff changeset
   145
    aHandleCount = 0;
hgs
parents:
diff changeset
   146
    //
hgs
parents:
diff changeset
   147
	return DoControl( EMemSpyDriverOpCodeCodeSegsGetAll, &params, NULL );
hgs
parents:
diff changeset
   148
    }
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
EXPORT_C TInt RMemSpyDriverClient::GetCodeSegs( TUint aPid, TAny** aHandleArray, TInt& aHandleCount )
hgs
parents:
diff changeset
   152
	{
hgs
parents:
diff changeset
   153
	TMemSpyDriverInternalCodeSnapshotParams params;
hgs
parents:
diff changeset
   154
	params.iFilter = aPid;
hgs
parents:
diff changeset
   155
	params.iHandles = aHandleArray;
hgs
parents:
diff changeset
   156
	params.iCountPtr = &aHandleCount;
hgs
parents:
diff changeset
   157
	params.iMaxCount = aHandleCount;
hgs
parents:
diff changeset
   158
    //
hgs
parents:
diff changeset
   159
    aHandleCount = 0;
hgs
parents:
diff changeset
   160
    //
hgs
parents:
diff changeset
   161
	return DoControl( EMemSpyDriverOpCodeCodeSegsGetCodeSegsForProcess, &params, NULL );
hgs
parents:
diff changeset
   162
	}
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
EXPORT_C TInt RMemSpyDriverClient::GetCodeSegInfo( TAny* aHandle, TUint aPid, TMemSpyDriverCodeSegInfo& aInfo )
hgs
parents:
diff changeset
   166
	{
hgs
parents:
diff changeset
   167
	TMemSpyDriverInternalCodeSegParams params;
hgs
parents:
diff changeset
   168
	params.iPid = aPid;
hgs
parents:
diff changeset
   169
	params.iHandle = aHandle;
hgs
parents:
diff changeset
   170
	params.iInfoPointer = &aInfo;
hgs
parents:
diff changeset
   171
    //
hgs
parents:
diff changeset
   172
	const TInt r = DoControl( EMemSpyDriverOpCodeCodeSegsGetCodeSegInfo, &params, NULL );
hgs
parents:
diff changeset
   173
	return r;
hgs
parents:
diff changeset
   174
	}
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
EXPORT_C TInt RMemSpyDriverClient::GetChunkHandles( TAny** aHandleArray, TInt& aHandleCount )
hgs
parents:
diff changeset
   203
    {
hgs
parents:
diff changeset
   204
	TMemSpyDriverInternalChunkHandleParams params;
hgs
parents:
diff changeset
   205
	params.iId = 0;
hgs
parents:
diff changeset
   206
	params.iType = EMemSpyDriverPrivateObjectTypeAll;
hgs
parents:
diff changeset
   207
	params.iHandles = aHandleArray;
hgs
parents:
diff changeset
   208
	params.iCountPtr = &aHandleCount;
hgs
parents:
diff changeset
   209
    params.iMaxCount = aHandleCount;
hgs
parents:
diff changeset
   210
    //
hgs
parents:
diff changeset
   211
    aHandleCount = 0;
hgs
parents:
diff changeset
   212
	//
hgs
parents:
diff changeset
   213
	const TInt err = DoControl( EMemSpyDriverOpCodeChunkGetHandles, &params, NULL );
hgs
parents:
diff changeset
   214
    return err;
hgs
parents:
diff changeset
   215
    }
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
hgs
parents:
diff changeset
   218
EXPORT_C TInt RMemSpyDriverClient::GetChunkInfo( TAny* aHandle, TMemSpyDriverChunkInfo& aInfo )
hgs
parents:
diff changeset
   219
    {
hgs
parents:
diff changeset
   220
	TMemSpyDriverInternalChunkInfoParams params;
hgs
parents:
diff changeset
   221
	TBuf8<KMaxFullName> name;
hgs
parents:
diff changeset
   222
	params.iHandle = aHandle;
hgs
parents:
diff changeset
   223
	const TInt r = DoControl( EMemSpyDriverOpCodeChunkGetInfo, &params, NULL );
hgs
parents:
diff changeset
   224
	//
hgs
parents:
diff changeset
   225
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   226
		{
hgs
parents:
diff changeset
   227
        aInfo.iHandle = aHandle;
hgs
parents:
diff changeset
   228
		aInfo.iBaseAddress = params.iBaseAddress;
hgs
parents:
diff changeset
   229
		aInfo.iSize = params.iSize;
hgs
parents:
diff changeset
   230
		aInfo.iMaxSize = params.iMaxSize;
hgs
parents:
diff changeset
   231
		aInfo.iOwnerId = params.iOwnerId;
hgs
parents:
diff changeset
   232
        aInfo.iType = params.iType;
hgs
parents:
diff changeset
   233
        aInfo.iAttributes = params.iAttributes;
hgs
parents:
diff changeset
   234
		aInfo.iName.Copy( params.iName );
hgs
parents:
diff changeset
   235
		}
hgs
parents:
diff changeset
   236
	//
hgs
parents:
diff changeset
   237
	return r;
hgs
parents:
diff changeset
   238
    }
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
hgs
parents:
diff changeset
   241
EXPORT_C TInt RMemSpyDriverClient::GetChunkInfo( TAny* aHandle, TMemSpyDriverChunkInfoWithoutName& aInfo )
hgs
parents:
diff changeset
   242
    {
hgs
parents:
diff changeset
   243
    TMemSpyDriverChunkInfo info;
hgs
parents:
diff changeset
   244
    //
hgs
parents:
diff changeset
   245
    const TInt r = GetChunkInfo( aHandle, info );
hgs
parents:
diff changeset
   246
    if  ( r == KErrNone )
hgs
parents:
diff changeset
   247
        {
hgs
parents:
diff changeset
   248
        aInfo = info;
hgs
parents:
diff changeset
   249
        }
hgs
parents:
diff changeset
   250
    //
hgs
parents:
diff changeset
   251
    return r;
hgs
parents:
diff changeset
   252
    }
hgs
parents:
diff changeset
   253
hgs
parents:
diff changeset
   254
hgs
parents:
diff changeset
   255
EXPORT_C TInt RMemSpyDriverClient::GetChunkHandlesForProcess( TUint aPid, TAny** aHandleArray, TInt& aHandleCount )
hgs
parents:
diff changeset
   256
    {
hgs
parents:
diff changeset
   257
	TMemSpyDriverInternalChunkHandleParams params;
hgs
parents:
diff changeset
   258
	params.iId = aPid;
hgs
parents:
diff changeset
   259
	params.iType = EMemSpyDriverPrivateObjectTypeProcess;
hgs
parents:
diff changeset
   260
	params.iHandles = aHandleArray;
hgs
parents:
diff changeset
   261
	params.iCountPtr = &aHandleCount;
hgs
parents:
diff changeset
   262
	params.iMaxCount = aHandleCount;
hgs
parents:
diff changeset
   263
	//
hgs
parents:
diff changeset
   264
    aHandleCount = 0;
hgs
parents:
diff changeset
   265
    //
hgs
parents:
diff changeset
   266
	return DoControl( EMemSpyDriverOpCodeChunkGetHandles, &params, NULL );
hgs
parents:
diff changeset
   267
    }
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
hgs
parents:
diff changeset
   270
EXPORT_C TInt RMemSpyDriverClient::GetChunkHandlesForThread( TUint aTid, TAny** aHandleArray, TInt& aHandleCount )
hgs
parents:
diff changeset
   271
    {
hgs
parents:
diff changeset
   272
	TMemSpyDriverInternalChunkHandleParams params;
hgs
parents:
diff changeset
   273
	params.iId = aTid;
hgs
parents:
diff changeset
   274
	params.iType = EMemSpyDriverPrivateObjectTypeThread;
hgs
parents:
diff changeset
   275
	params.iHandles = aHandleArray;
hgs
parents:
diff changeset
   276
	params.iCountPtr = &aHandleCount;
hgs
parents:
diff changeset
   277
	params.iMaxCount = aHandleCount;
hgs
parents:
diff changeset
   278
	//
hgs
parents:
diff changeset
   279
    aHandleCount = 0;
hgs
parents:
diff changeset
   280
    //
hgs
parents:
diff changeset
   281
	return DoControl( EMemSpyDriverOpCodeChunkGetHandles, &params, NULL );
hgs
parents:
diff changeset
   282
    }
hgs
parents:
diff changeset
   283
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
hgs
parents:
diff changeset
   291
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
hgs
parents:
diff changeset
   294
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
hgs
parents:
diff changeset
   301
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
EXPORT_C TInt RMemSpyDriverClient::GetThreadInfo( TUint aTid, TMemSpyDriverThreadInfo& aInfo )
hgs
parents:
diff changeset
   305
	{
hgs
parents:
diff changeset
   306
	TMemSpyDriverInternalThreadInfoParams params;
hgs
parents:
diff changeset
   307
    params.iRHeapVTable = RHeapVTable();
hgs
parents:
diff changeset
   308
    params.iDebugAllocator = DebugEUser();
hgs
parents:
diff changeset
   309
    //
hgs
parents:
diff changeset
   310
	TInt r = DoControl( EMemSpyDriverOpCodeThreadAndProcessGetInfoThread, (TAny*)aTid, &params);
hgs
parents:
diff changeset
   311
	//
hgs
parents:
diff changeset
   312
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   313
		{
hgs
parents:
diff changeset
   314
        // Copy common properties
hgs
parents:
diff changeset
   315
        Mem::Copy( &aInfo, &params, sizeof( TMemSpyDriverThreadInfoBase ) );
hgs
parents:
diff changeset
   316
hgs
parents:
diff changeset
   317
        // Copy name
hgs
parents:
diff changeset
   318
        aInfo.iFullName.Copy( params.iFullName );
hgs
parents:
diff changeset
   319
hgs
parents:
diff changeset
   320
        // Get other basic properties via RThread
hgs
parents:
diff changeset
   321
        RThread thread;
hgs
parents:
diff changeset
   322
        r = OpenThread( aTid, thread );
hgs
parents:
diff changeset
   323
        if ( r == KErrNone )
hgs
parents:
diff changeset
   324
            {
hgs
parents:
diff changeset
   325
            RProcess process;
hgs
parents:
diff changeset
   326
            r = thread.Process( process );
hgs
parents:
diff changeset
   327
            if ( r == KErrNone )
hgs
parents:
diff changeset
   328
                {
hgs
parents:
diff changeset
   329
	            aInfo.iPid = process.Id();
hgs
parents:
diff changeset
   330
                process.Close();
hgs
parents:
diff changeset
   331
                }
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
            aInfo.iThreadPriority = thread.Priority();
hgs
parents:
diff changeset
   334
            aInfo.iExitReason = thread.ExitReason();
hgs
parents:
diff changeset
   335
            aInfo.iExitType = thread.ExitType();
hgs
parents:
diff changeset
   336
            aInfo.iExitCategory = thread.ExitCategory();
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
            thread.Close();
hgs
parents:
diff changeset
   339
            }
hgs
parents:
diff changeset
   340
        }
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
    return r;
hgs
parents:
diff changeset
   343
	}
hgs
parents:
diff changeset
   344
hgs
parents:
diff changeset
   345
EXPORT_C TInt RMemSpyDriverClient::GetProcessInfo( TUint aPid, TMemSpyDriverProcessInfo& aInfo )
hgs
parents:
diff changeset
   346
    {
hgs
parents:
diff changeset
   347
	TInt r = DoControl( EMemSpyDriverOpCodeThreadAndProcessGetInfoProcess, (TAny*)aPid, &aInfo);
hgs
parents:
diff changeset
   348
    
hgs
parents:
diff changeset
   349
    // Get other properties via RProcess.
hgs
parents:
diff changeset
   350
    if  ( r == KErrNone )
hgs
parents:
diff changeset
   351
        {
hgs
parents:
diff changeset
   352
        RProcess process;
hgs
parents:
diff changeset
   353
        r = OpenProcess( aPid, process );
hgs
parents:
diff changeset
   354
        if  ( r == KErrNone )
hgs
parents:
diff changeset
   355
            {
hgs
parents:
diff changeset
   356
            aInfo.iUids = process.Type();
hgs
parents:
diff changeset
   357
            aInfo.iPriority = process.Priority();
hgs
parents:
diff changeset
   358
            //
hgs
parents:
diff changeset
   359
            process.Close();
hgs
parents:
diff changeset
   360
            }
hgs
parents:
diff changeset
   361
        }
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
    return r;
hgs
parents:
diff changeset
   364
    }
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
hgs
parents:
diff changeset
   367
EXPORT_C TInt RMemSpyDriverClient::ProcessThreadsSuspend( TUint aPid )
hgs
parents:
diff changeset
   368
    {
hgs
parents:
diff changeset
   369
	return DoControl( EMemSpyDriverOpCodeThreadAndProcessSuspendAllThreads, (TAny*) aPid, NULL );
hgs
parents:
diff changeset
   370
    }
hgs
parents:
diff changeset
   371
hgs
parents:
diff changeset
   372
hgs
parents:
diff changeset
   373
EXPORT_C TInt RMemSpyDriverClient::ProcessThreadsResume( TUint aPid )
hgs
parents:
diff changeset
   374
    {
hgs
parents:
diff changeset
   375
	return DoControl( EMemSpyDriverOpCodeThreadAndProcessResumeAllThreads, (TAny*) aPid, NULL );
hgs
parents:
diff changeset
   376
    }
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
hgs
parents:
diff changeset
   379
EXPORT_C TInt RMemSpyDriverClient::ThreadEnd( TUint aId, TExitType aType )
hgs
parents:
diff changeset
   380
    {
hgs
parents:
diff changeset
   381
    TInt err = KErrNone;
hgs
parents:
diff changeset
   382
    //
hgs
parents:
diff changeset
   383
    if  ( aType == EExitPending )
hgs
parents:
diff changeset
   384
        {
hgs
parents:
diff changeset
   385
        err = KErrArgument;
hgs
parents:
diff changeset
   386
        }
hgs
parents:
diff changeset
   387
    else
hgs
parents:
diff changeset
   388
        {
hgs
parents:
diff changeset
   389
        err = DoControl( EMemSpyDriverOpCodeThreadAndProcessEndThread, (TAny*) aId, (TAny*) aType );
hgs
parents:
diff changeset
   390
        }
hgs
parents:
diff changeset
   391
    //
hgs
parents:
diff changeset
   392
    return err;
hgs
parents:
diff changeset
   393
    }
hgs
parents:
diff changeset
   394
hgs
parents:
diff changeset
   395
hgs
parents:
diff changeset
   396
EXPORT_C TInt RMemSpyDriverClient::OpenThread( TUint aId, RThread& aThread )
hgs
parents:
diff changeset
   397
    {
hgs
parents:
diff changeset
   398
    TInt ret = KErrNone;
hgs
parents:
diff changeset
   399
    aThread.Close();
hgs
parents:
diff changeset
   400
    //
hgs
parents:
diff changeset
   401
    const TInt err = DoControl( EMemSpyDriverOpCodeThreadAndProcessOpenThread, (TAny*) aId );
hgs
parents:
diff changeset
   402
    if  ( err > 0 )
hgs
parents:
diff changeset
   403
        {
hgs
parents:
diff changeset
   404
        aThread.SetHandle( err );
hgs
parents:
diff changeset
   405
        ret = KErrNone;
hgs
parents:
diff changeset
   406
        }
hgs
parents:
diff changeset
   407
    else
hgs
parents:
diff changeset
   408
        {
hgs
parents:
diff changeset
   409
        ret = err;
hgs
parents:
diff changeset
   410
        }
hgs
parents:
diff changeset
   411
    //
hgs
parents:
diff changeset
   412
    return ret;
hgs
parents:
diff changeset
   413
    }
hgs
parents:
diff changeset
   414
hgs
parents:
diff changeset
   415
hgs
parents:
diff changeset
   416
EXPORT_C TInt RMemSpyDriverClient::OpenProcess( TUint aId, RProcess& aProcess )
hgs
parents:
diff changeset
   417
    {
hgs
parents:
diff changeset
   418
    TInt ret = KErrNone;
hgs
parents:
diff changeset
   419
    aProcess.Close();
hgs
parents:
diff changeset
   420
    //
hgs
parents:
diff changeset
   421
    const TInt err = DoControl( EMemSpyDriverOpCodeThreadAndProcessOpenProcess, (TAny*) aId );
hgs
parents:
diff changeset
   422
    if  ( err > 0 )
hgs
parents:
diff changeset
   423
        {
hgs
parents:
diff changeset
   424
        aProcess.SetHandle( err );
hgs
parents:
diff changeset
   425
        ret = KErrNone;
hgs
parents:
diff changeset
   426
        }
hgs
parents:
diff changeset
   427
    else
hgs
parents:
diff changeset
   428
        {
hgs
parents:
diff changeset
   429
        ret = err;
hgs
parents:
diff changeset
   430
        }
hgs
parents:
diff changeset
   431
    //
hgs
parents:
diff changeset
   432
    return ret;
hgs
parents:
diff changeset
   433
    }
hgs
parents:
diff changeset
   434
hgs
parents:
diff changeset
   435
hgs
parents:
diff changeset
   436
EXPORT_C void RMemSpyDriverClient::GetThreadsL( const TProcessId& aId, RArray<TThreadId>& aThreads )
hgs
parents:
diff changeset
   437
    {
hgs
parents:
diff changeset
   438
	aThreads.Reset();
hgs
parents:
diff changeset
   439
    //
hgs
parents:
diff changeset
   440
    ResetStreamBuffer();
hgs
parents:
diff changeset
   441
    const TInt err = DoControl( EMemSpyDriverOpCodeThreadAndProcessGetThreads, (TAny*) (TUint) aId, (TAny*) &iBuffer );
hgs
parents:
diff changeset
   442
    User::LeaveIfError( err );
hgs
parents:
diff changeset
   443
hgs
parents:
diff changeset
   444
    // Open stream
hgs
parents:
diff changeset
   445
    RMemSpyMemStreamReader stream = StreamOpenL();
hgs
parents:
diff changeset
   446
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
   447
        
hgs
parents:
diff changeset
   448
    // Extract thread ids
hgs
parents:
diff changeset
   449
    const TInt threadCount = stream.ReadInt32L();
hgs
parents:
diff changeset
   450
    for( TInt i=0; i<threadCount; i++ )
hgs
parents:
diff changeset
   451
        {
hgs
parents:
diff changeset
   452
        const TThreadId id( stream.ReadUint32L() );
hgs
parents:
diff changeset
   453
        aThreads.AppendL( id );
hgs
parents:
diff changeset
   454
        }
hgs
parents:
diff changeset
   455
        
hgs
parents:
diff changeset
   456
    // Tidy up
hgs
parents:
diff changeset
   457
    CleanupStack::PopAndDestroy( &stream );
hgs
parents:
diff changeset
   458
    }
hgs
parents:
diff changeset
   459
hgs
parents:
diff changeset
   460
hgs
parents:
diff changeset
   461
EXPORT_C TInt RMemSpyDriverClient::SetPriority( TUint aId, TThreadPriority aPriority )
hgs
parents:
diff changeset
   462
    {
hgs
parents:
diff changeset
   463
    // The kernel side API to set thread priority expects a value in the range of 0-63, i.e. an absolute
hgs
parents:
diff changeset
   464
    // NThread priority. In order to support process-relative thread priorities, we'd need to duplicate
hgs
parents:
diff changeset
   465
    // the kernel priority mapping tables - not a good idea - therefore we'll only support absolute values.
hgs
parents:
diff changeset
   466
    TInt err = KErrNone;
hgs
parents:
diff changeset
   467
    if  ( aPriority < EPriorityAbsoluteVeryLow )
hgs
parents:
diff changeset
   468
        {
hgs
parents:
diff changeset
   469
        err = KErrArgument;
hgs
parents:
diff changeset
   470
        }
hgs
parents:
diff changeset
   471
    else
hgs
parents:
diff changeset
   472
        {
hgs
parents:
diff changeset
   473
        err = DoControl( EMemSpyDriverOpCodeThreadAndProcessSetPriorityThread, (TAny*) aId, (TAny*) aPriority );
hgs
parents:
diff changeset
   474
        }
hgs
parents:
diff changeset
   475
    //
hgs
parents:
diff changeset
   476
    return err;
hgs
parents:
diff changeset
   477
    }
hgs
parents:
diff changeset
   478
hgs
parents:
diff changeset
   479
hgs
parents:
diff changeset
   480
hgs
parents:
diff changeset
   481
hgs
parents:
diff changeset
   482
hgs
parents:
diff changeset
   483
hgs
parents:
diff changeset
   484
hgs
parents:
diff changeset
   485
hgs
parents:
diff changeset
   486
hgs
parents:
diff changeset
   487
hgs
parents:
diff changeset
   488
hgs
parents:
diff changeset
   489
hgs
parents:
diff changeset
   490
hgs
parents:
diff changeset
   491
hgs
parents:
diff changeset
   492
hgs
parents:
diff changeset
   493
EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoUser( TMemSpyHeapInfo& aInfo, TUint aTid )
hgs
parents:
diff changeset
   494
    {
hgs
parents:
diff changeset
   495
    TMemSpyDriverInternalHeapRequestParameters params;
hgs
parents:
diff changeset
   496
    //
hgs
parents:
diff changeset
   497
    params.iTid = aTid;
hgs
parents:
diff changeset
   498
    params.iRHeapVTable = RHeapVTable();
hgs
parents:
diff changeset
   499
    params.iDebugAllocator = DebugEUser();
hgs
parents:
diff changeset
   500
    params.iMasterInfo = &aInfo;
hgs
parents:
diff changeset
   501
    //
hgs
parents:
diff changeset
   502
	TInt r = DoControl( EMemSpyDriverOpCodeHeapInfoGetUser, &params, NULL );
hgs
parents:
diff changeset
   503
	//
hgs
parents:
diff changeset
   504
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   505
    	{
hgs
parents:
diff changeset
   506
        PrintHeapInfo( aInfo );
hgs
parents:
diff changeset
   507
        
hgs
parents:
diff changeset
   508
        // Need to do this on the user-side
hgs
parents:
diff changeset
   509
        if  ( aInfo.Type() == TMemSpyHeapInfo::ETypeRHeap )
hgs
parents:
diff changeset
   510
            {
hgs
parents:
diff changeset
   511
            TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
hgs
parents:
diff changeset
   512
            TMemSpyHeapMetaDataRHeap& metaData = rHeapInfo.MetaData();
hgs
parents:
diff changeset
   513
            metaData.SetVTable( RHeapVTable() );
hgs
parents:
diff changeset
   514
            //metaData.SetClassSize( sizeof( RHeap ) );
hgs
parents:
diff changeset
   515
            }
hgs
parents:
diff changeset
   516
        }
hgs
parents:
diff changeset
   517
    else if ( r == KErrNotSupported )
hgs
parents:
diff changeset
   518
        {
hgs
parents:
diff changeset
   519
        aInfo.SetType( TMemSpyHeapInfo::ETypeUnknown );
hgs
parents:
diff changeset
   520
        r = KErrNone;
hgs
parents:
diff changeset
   521
        }
hgs
parents:
diff changeset
   522
	//
hgs
parents:
diff changeset
   523
	return r;
hgs
parents:
diff changeset
   524
    }
hgs
parents:
diff changeset
   525
hgs
parents:
diff changeset
   526
EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoUser( TMemSpyHeapInfo& aInfo, TUint aTid, RArray< TMemSpyDriverFreeCell >& aFreeCells )
hgs
parents:
diff changeset
   527
	{
hgs
parents:
diff changeset
   528
	return GetHeapInfoUser(aInfo, aTid, aFreeCells, EFalse);
hgs
parents:
diff changeset
   529
	}
hgs
parents:
diff changeset
   530
hgs
parents:
diff changeset
   531
// For the record I don't think this function should be exported, but since the one above was I'm going with the flow. -TomS
hgs
parents:
diff changeset
   532
EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoUser(TMemSpyHeapInfo& aInfo, TUint aTid, RArray<TMemSpyDriverCell>& aCells, TBool aCollectAllocatedCellsAsWellAsFree)
hgs
parents:
diff changeset
   533
	{
hgs
parents:
diff changeset
   534
    TMemSpyDriverInternalHeapRequestParameters params;
hgs
parents:
diff changeset
   535
    //
hgs
parents:
diff changeset
   536
    params.iTid = aTid;
hgs
parents:
diff changeset
   537
    params.iRHeapVTable = RHeapVTable();
hgs
parents:
diff changeset
   538
    params.iDebugAllocator = DebugEUser();
hgs
parents:
diff changeset
   539
    params.iMasterInfo = &aInfo;
hgs
parents:
diff changeset
   540
    params.iBuildFreeCellList = ETrue;
hgs
parents:
diff changeset
   541
	params.iBuildAllocCellList = aCollectAllocatedCellsAsWellAsFree;
hgs
parents:
diff changeset
   542
hgs
parents:
diff changeset
   543
    //
hgs
parents:
diff changeset
   544
    aCells.Reset();
hgs
parents:
diff changeset
   545
    ResetStreamBuffer();
hgs
parents:
diff changeset
   546
	TInt r = DoControl( EMemSpyDriverOpCodeHeapInfoGetUser, &params );
hgs
parents:
diff changeset
   547
	//
hgs
parents:
diff changeset
   548
	if  ( r >= KErrNone )
hgs
parents:
diff changeset
   549
    	{
hgs
parents:
diff changeset
   550
        PrintHeapInfo( aInfo );
hgs
parents:
diff changeset
   551
        
hgs
parents:
diff changeset
   552
        // Need to do this on the user-side
hgs
parents:
diff changeset
   553
        if  ( aInfo.Type() == TMemSpyHeapInfo::ETypeRHeap )
hgs
parents:
diff changeset
   554
            {
hgs
parents:
diff changeset
   555
            TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
hgs
parents:
diff changeset
   556
            TMemSpyHeapMetaDataRHeap& metaData = rHeapInfo.MetaData();
hgs
parents:
diff changeset
   557
            metaData.SetVTable( RHeapVTable() );
hgs
parents:
diff changeset
   558
            //metaData.SetClassSize( sizeof( RHeap ) );
hgs
parents:
diff changeset
   559
            }
hgs
parents:
diff changeset
   560
hgs
parents:
diff changeset
   561
        // Resize transfer buffer to make room for free cells. We only make the buffer
hgs
parents:
diff changeset
   562
        // bigger, not smaller.
hgs
parents:
diff changeset
   563
        if  ( iBuffer.Size() < r )
hgs
parents:
diff changeset
   564
            {
hgs
parents:
diff changeset
   565
            r = iBuffer.ReAlloc( r );
hgs
parents:
diff changeset
   566
            }
hgs
parents:
diff changeset
   567
    
hgs
parents:
diff changeset
   568
        // Now fetch the heap data
hgs
parents:
diff changeset
   569
        if  ( r == KErrNone )
hgs
parents:
diff changeset
   570
            {
hgs
parents:
diff changeset
   571
            r = DoControl( EMemSpyDriverOpCodeHeapInfoFetchCellList, &iBuffer );
hgs
parents:
diff changeset
   572
            if  ( r == KErrNone )
hgs
parents:
diff changeset
   573
                {
hgs
parents:
diff changeset
   574
                TRAP( r, ReadHeapInfoFreeCellsFromXferBufferL( aCells ) );
hgs
parents:
diff changeset
   575
                }
hgs
parents:
diff changeset
   576
            }
hgs
parents:
diff changeset
   577
        }
hgs
parents:
diff changeset
   578
    else if ( r == KErrNotSupported )
hgs
parents:
diff changeset
   579
        {
hgs
parents:
diff changeset
   580
        aInfo.SetType( TMemSpyHeapInfo::ETypeUnknown );
hgs
parents:
diff changeset
   581
        r = KErrNone;
hgs
parents:
diff changeset
   582
        }
hgs
parents:
diff changeset
   583
	//
hgs
parents:
diff changeset
   584
	return r;
hgs
parents:
diff changeset
   585
    }
hgs
parents:
diff changeset
   586
hgs
parents:
diff changeset
   587
hgs
parents:
diff changeset
   588
EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoKernel( TMemSpyHeapInfo& aInfo )
hgs
parents:
diff changeset
   589
    {
hgs
parents:
diff changeset
   590
    TMemSpyDriverInternalHeapRequestParameters params;
hgs
parents:
diff changeset
   591
    params.iTid = KMemSpyDriverGetKernelHeapDataPseudoThreadId;
hgs
parents:
diff changeset
   592
    params.iRHeapVTable = NULL;
hgs
parents:
diff changeset
   593
    params.iMasterInfo = &aInfo;
hgs
parents:
diff changeset
   594
	TInt r = DoControl( EMemSpyDriverOpCodeHeapInfoGetKernel, &params, NULL );
hgs
parents:
diff changeset
   595
	//
hgs
parents:
diff changeset
   596
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   597
    	{
hgs
parents:
diff changeset
   598
        PrintHeapInfo( aInfo );
hgs
parents:
diff changeset
   599
        }
hgs
parents:
diff changeset
   600
    else if ( r == KErrNotSupported )
hgs
parents:
diff changeset
   601
        {
hgs
parents:
diff changeset
   602
        aInfo.SetType( TMemSpyHeapInfo::ETypeUnknown );
hgs
parents:
diff changeset
   603
        r = KErrNone;
hgs
parents:
diff changeset
   604
        }
hgs
parents:
diff changeset
   605
	//
hgs
parents:
diff changeset
   606
	return r;
hgs
parents:
diff changeset
   607
    }
hgs
parents:
diff changeset
   608
hgs
parents:
diff changeset
   609
hgs
parents:
diff changeset
   610
EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoKernel( TMemSpyHeapInfo& aInfo, RArray< TMemSpyDriverFreeCell >& aFreeCells )
hgs
parents:
diff changeset
   611
    {
hgs
parents:
diff changeset
   612
    TMemSpyDriverInternalHeapRequestParameters params;
hgs
parents:
diff changeset
   613
    params.iTid = KMemSpyDriverGetKernelHeapDataPseudoThreadId;
hgs
parents:
diff changeset
   614
    params.iRHeapVTable = NULL;
hgs
parents:
diff changeset
   615
    params.iMasterInfo = &aInfo;
hgs
parents:
diff changeset
   616
    //
hgs
parents:
diff changeset
   617
    aFreeCells.Reset();
hgs
parents:
diff changeset
   618
    ResetStreamBuffer();
hgs
parents:
diff changeset
   619
	TInt r = DoControl( EMemSpyDriverOpCodeHeapInfoGetKernel, &params, (TAny*) &iBuffer );
hgs
parents:
diff changeset
   620
	//
hgs
parents:
diff changeset
   621
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   622
    	{
hgs
parents:
diff changeset
   623
        PrintHeapInfo( aInfo );
hgs
parents:
diff changeset
   624
        TRAP( r, ReadHeapInfoFreeCellsFromXferBufferL( aFreeCells ) );
hgs
parents:
diff changeset
   625
        }
hgs
parents:
diff changeset
   626
    else if ( r == KErrNotSupported )
hgs
parents:
diff changeset
   627
        {
hgs
parents:
diff changeset
   628
        aInfo.SetType( TMemSpyHeapInfo::ETypeUnknown );
hgs
parents:
diff changeset
   629
        r = KErrNone;
hgs
parents:
diff changeset
   630
        }
hgs
parents:
diff changeset
   631
	//
hgs
parents:
diff changeset
   632
	return r;
hgs
parents:
diff changeset
   633
    }
hgs
parents:
diff changeset
   634
hgs
parents:
diff changeset
   635
hgs
parents:
diff changeset
   636
EXPORT_C TBool RMemSpyDriverClient::IsDebugKernel()
hgs
parents:
diff changeset
   637
    {
hgs
parents:
diff changeset
   638
    TBool isDebugKernel = EFalse;
hgs
parents:
diff changeset
   639
    DoControl( EMemSpyDriverOpCodeHeapInfoGetIsDebugKernel, (TAny*) &isDebugKernel );
hgs
parents:
diff changeset
   640
    return isDebugKernel;
hgs
parents:
diff changeset
   641
    }
hgs
parents:
diff changeset
   642
hgs
parents:
diff changeset
   643
hgs
parents:
diff changeset
   644
hgs
parents:
diff changeset
   645
hgs
parents:
diff changeset
   646
hgs
parents:
diff changeset
   647
hgs
parents:
diff changeset
   648
hgs
parents:
diff changeset
   649
hgs
parents:
diff changeset
   650
hgs
parents:
diff changeset
   651
hgs
parents:
diff changeset
   652
hgs
parents:
diff changeset
   653
hgs
parents:
diff changeset
   654
hgs
parents:
diff changeset
   655
hgs
parents:
diff changeset
   656
hgs
parents:
diff changeset
   657
hgs
parents:
diff changeset
   658
hgs
parents:
diff changeset
   659
hgs
parents:
diff changeset
   660
hgs
parents:
diff changeset
   661
hgs
parents:
diff changeset
   662
hgs
parents:
diff changeset
   663
hgs
parents:
diff changeset
   664
EXPORT_C TInt RMemSpyDriverClient::GetHeapData( TUint aTid, TUint32 aFreeCellChecksum, TDes8& aDest, TUint& aReadAddress, TUint& aAmountRemaining )
hgs
parents:
diff changeset
   665
    {
hgs
parents:
diff changeset
   666
    TMemSpyDriverInternalHeapDataParams params;
hgs
parents:
diff changeset
   667
    params.iTid = aTid;
hgs
parents:
diff changeset
   668
    params.iRHeapVTable = RHeapVTable();
hgs
parents:
diff changeset
   669
    params.iDebugAllocator = DebugEUser();
hgs
parents:
diff changeset
   670
    params.iDes = &aDest;
hgs
parents:
diff changeset
   671
    params.iChecksum = aFreeCellChecksum;
hgs
parents:
diff changeset
   672
    params.iRemaining = -1;
hgs
parents:
diff changeset
   673
	params.iReadAddress = 0;
hgs
parents:
diff changeset
   674
    aDest.Zero();
hgs
parents:
diff changeset
   675
    //
hgs
parents:
diff changeset
   676
	TInt r = DoControl( EMemSpyDriverOpCodeHeapDataGetUser, &params, NULL );
hgs
parents:
diff changeset
   677
	//
hgs
parents:
diff changeset
   678
	if  ( r >= KErrNone )
hgs
parents:
diff changeset
   679
    	{
hgs
parents:
diff changeset
   680
        aDest.SetLength( r );
hgs
parents:
diff changeset
   681
        aReadAddress = params.iReadAddress;
hgs
parents:
diff changeset
   682
    	aAmountRemaining = params.iRemaining;
hgs
parents:
diff changeset
   683
        r = KErrNone;
hgs
parents:
diff changeset
   684
    	}
hgs
parents:
diff changeset
   685
	//
hgs
parents:
diff changeset
   686
	return r;
hgs
parents:
diff changeset
   687
    }
hgs
parents:
diff changeset
   688
hgs
parents:
diff changeset
   689
hgs
parents:
diff changeset
   690
EXPORT_C TInt RMemSpyDriverClient::GetHeapDataNext( TUint aTid, TDes8& aDest, TUint& aReadAddress, TUint& aAmountRemaining )
hgs
parents:
diff changeset
   691
    {
hgs
parents:
diff changeset
   692
    TMemSpyDriverInternalHeapDataParams params;
hgs
parents:
diff changeset
   693
    params.iTid = aTid;
hgs
parents:
diff changeset
   694
    params.iRHeapVTable = RHeapVTable();
hgs
parents:
diff changeset
   695
    params.iDebugAllocator = DebugEUser();
hgs
parents:
diff changeset
   696
    params.iDes = &aDest;
hgs
parents:
diff changeset
   697
    params.iChecksum = 0;
hgs
parents:
diff changeset
   698
    params.iRemaining = aAmountRemaining;
hgs
parents:
diff changeset
   699
	params.iReadAddress = aReadAddress;
hgs
parents:
diff changeset
   700
    aDest.Zero();
hgs
parents:
diff changeset
   701
    //
hgs
parents:
diff changeset
   702
	TInt r = DoControl( EMemSpyDriverOpCodeHeapDataGetUser, &params, NULL );
hgs
parents:
diff changeset
   703
	//
hgs
parents:
diff changeset
   704
	if  ( r >= KErrNone )
hgs
parents:
diff changeset
   705
    	{
hgs
parents:
diff changeset
   706
        aDest.SetLength( r );
hgs
parents:
diff changeset
   707
        aReadAddress = params.iReadAddress;
hgs
parents:
diff changeset
   708
    	aAmountRemaining = params.iRemaining;
hgs
parents:
diff changeset
   709
        r = KErrNone;
hgs
parents:
diff changeset
   710
    	}
hgs
parents:
diff changeset
   711
	//
hgs
parents:
diff changeset
   712
    return r;
hgs
parents:
diff changeset
   713
    }
hgs
parents:
diff changeset
   714
hgs
parents:
diff changeset
   715
hgs
parents:
diff changeset
   716
hgs
parents:
diff changeset
   717
EXPORT_C HBufC8* RMemSpyDriverClient::GetHeapDataKernelLC( TMemSpyHeapInfo& aInfo, RArray<TMemSpyDriverFreeCell>& aFreeCells )
hgs
parents:
diff changeset
   718
    {
hgs
parents:
diff changeset
   719
    HBufC8* data = NULL;
hgs
parents:
diff changeset
   720
hgs
parents:
diff changeset
   721
    // Going to fetch free cells via stream buffer...
hgs
parents:
diff changeset
   722
    ResetStreamBuffer();
hgs
parents:
diff changeset
   723
hgs
parents:
diff changeset
   724
    // First pass is to preallocate buffer for kernel heap, and fetch metadata and free cells
hgs
parents:
diff changeset
   725
    TInt sizeOrError = DoControl( EMemSpyDriverOpCodeHeapDataGetKernelInit, (TAny*) &aInfo, (TAny*) &iBuffer );
hgs
parents:
diff changeset
   726
	if  ( sizeOrError >= KErrNone )
hgs
parents:
diff changeset
   727
    	{
hgs
parents:
diff changeset
   728
        const TInt kernelHeapSize = sizeOrError;
hgs
parents:
diff changeset
   729
        if  ( aInfo.Type() != TMemSpyHeapInfo::ETypeRHeap )
hgs
parents:
diff changeset
   730
            {
hgs
parents:
diff changeset
   731
            User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   732
            }
hgs
parents:
diff changeset
   733
        else
hgs
parents:
diff changeset
   734
            {
hgs
parents:
diff changeset
   735
            // Extract free cells
hgs
parents:
diff changeset
   736
            ReadHeapInfoFreeCellsFromXferBufferL( aFreeCells );
hgs
parents:
diff changeset
   737
hgs
parents:
diff changeset
   738
            // It's okay to treat the heap info as an RHeap
hgs
parents:
diff changeset
   739
            PrintHeapInfo( aInfo );
hgs
parents:
diff changeset
   740
hgs
parents:
diff changeset
   741
            // Allocate data sink and do fetch
hgs
parents:
diff changeset
   742
            data = HBufC8::NewLC( kernelHeapSize );
hgs
parents:
diff changeset
   743
            TPtr8 pBuffer( data->Des() );
hgs
parents:
diff changeset
   744
hgs
parents:
diff changeset
   745
	        sizeOrError = DoControl( EMemSpyDriverOpCodeHeapDataGetKernelFetch, &pBuffer, NULL );
hgs
parents:
diff changeset
   746
            }
hgs
parents:
diff changeset
   747
        }
hgs
parents:
diff changeset
   748
hgs
parents:
diff changeset
   749
    User::LeaveIfError( sizeOrError );
hgs
parents:
diff changeset
   750
    return data;
hgs
parents:
diff changeset
   751
    }
hgs
parents:
diff changeset
   752
hgs
parents:
diff changeset
   753
hgs
parents:
diff changeset
   754
hgs
parents:
diff changeset
   755
hgs
parents:
diff changeset
   756
hgs
parents:
diff changeset
   757
hgs
parents:
diff changeset
   758
hgs
parents:
diff changeset
   759
hgs
parents:
diff changeset
   760
hgs
parents:
diff changeset
   761
hgs
parents:
diff changeset
   762
hgs
parents:
diff changeset
   763
hgs
parents:
diff changeset
   764
hgs
parents:
diff changeset
   765
hgs
parents:
diff changeset
   766
hgs
parents:
diff changeset
   767
hgs
parents:
diff changeset
   768
hgs
parents:
diff changeset
   769
hgs
parents:
diff changeset
   770
hgs
parents:
diff changeset
   771
hgs
parents:
diff changeset
   772
hgs
parents:
diff changeset
   773
hgs
parents:
diff changeset
   774
hgs
parents:
diff changeset
   775
hgs
parents:
diff changeset
   776
hgs
parents:
diff changeset
   777
hgs
parents:
diff changeset
   778
hgs
parents:
diff changeset
   779
hgs
parents:
diff changeset
   780
hgs
parents:
diff changeset
   781
hgs
parents:
diff changeset
   782
hgs
parents:
diff changeset
   783
hgs
parents:
diff changeset
   784
hgs
parents:
diff changeset
   785
hgs
parents:
diff changeset
   786
hgs
parents:
diff changeset
   787
hgs
parents:
diff changeset
   788
EXPORT_C TInt RMemSpyDriverClient::WalkHeapInit( TUint aTid )
hgs
parents:
diff changeset
   789
    {
hgs
parents:
diff changeset
   790
    TMemSpyDriverInternalWalkHeapParamsInit params;
hgs
parents:
diff changeset
   791
    params.iTid = aTid;
hgs
parents:
diff changeset
   792
    params.iRHeapVTable = RHeapVTable();
hgs
parents:
diff changeset
   793
    params.iDebugAllocator = DebugEUser();
hgs
parents:
diff changeset
   794
    //
hgs
parents:
diff changeset
   795
	const TInt r = DoControl( EMemSpyDriverOpCodeWalkHeapInit, &params, NULL );
hgs
parents:
diff changeset
   796
	return r;
hgs
parents:
diff changeset
   797
    }
hgs
parents:
diff changeset
   798
hgs
parents:
diff changeset
   799
hgs
parents:
diff changeset
   800
EXPORT_C TInt RMemSpyDriverClient::WalkHeapNextCell( TUint aTid, TMemSpyDriverCellType& aCellType, TAny*& aCellAddress, TInt& aLength, TInt& aNestingLevel, TInt& aAllocNumber, TInt& aCellHeaderSize, TAny*& aCellPayloadAddress )
hgs
parents:
diff changeset
   801
    {
hgs
parents:
diff changeset
   802
    aCellType = EMemSpyDriverBadCellMask;
hgs
parents:
diff changeset
   803
    aCellAddress = NULL;
hgs
parents:
diff changeset
   804
    aLength = 0;
hgs
parents:
diff changeset
   805
    aNestingLevel = 0;
hgs
parents:
diff changeset
   806
    aAllocNumber = 0;
hgs
parents:
diff changeset
   807
    aCellHeaderSize = 0;
hgs
parents:
diff changeset
   808
    aCellPayloadAddress = NULL;
hgs
parents:
diff changeset
   809
    //
hgs
parents:
diff changeset
   810
    TMemSpyDriverInternalWalkHeapParamsCell params;
hgs
parents:
diff changeset
   811
	const TInt r = DoControl( EMemSpyDriverOpCodeWalkHeapNextCell, (TAny*) aTid, &params );
hgs
parents:
diff changeset
   812
    //
hgs
parents:
diff changeset
   813
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   814
	    {
hgs
parents:
diff changeset
   815
        aCellType = (TMemSpyDriverCellType) params.iCellType;
hgs
parents:
diff changeset
   816
        aCellAddress = params.iCellAddress;
hgs
parents:
diff changeset
   817
        aLength = params.iLength;
hgs
parents:
diff changeset
   818
        aNestingLevel = params.iNestingLevel;
hgs
parents:
diff changeset
   819
        aAllocNumber = params.iAllocNumber;
hgs
parents:
diff changeset
   820
        aCellPayloadAddress = ((TUint8*) aCellAddress) + aCellHeaderSize;
hgs
parents:
diff changeset
   821
        }
hgs
parents:
diff changeset
   822
    //
hgs
parents:
diff changeset
   823
   	return r;
hgs
parents:
diff changeset
   824
    }
hgs
parents:
diff changeset
   825
hgs
parents:
diff changeset
   826
hgs
parents:
diff changeset
   827
EXPORT_C TInt RMemSpyDriverClient::WalkHeapReadCellData( TAny* aCellAddress, TDes8& aDest, TInt aReadLen )
hgs
parents:
diff changeset
   828
    {
hgs
parents:
diff changeset
   829
    TMemSpyDriverInternalWalkHeapCellDataReadParams params;
hgs
parents:
diff changeset
   830
    params.iCellAddress = aCellAddress;
hgs
parents:
diff changeset
   831
    params.iReadLen = aReadLen;
hgs
parents:
diff changeset
   832
    params.iDes = &aDest;
hgs
parents:
diff changeset
   833
    aDest.Zero();
hgs
parents:
diff changeset
   834
    //
hgs
parents:
diff changeset
   835
	TInt r = DoControl( EMemSpyDriverOpCodeWalkHeapReadCellData, &params, NULL );
hgs
parents:
diff changeset
   836
    if  ( r >= KErrNone )
hgs
parents:
diff changeset
   837
        {
hgs
parents:
diff changeset
   838
        aDest.SetLength( r );
hgs
parents:
diff changeset
   839
        r = KErrNone;
hgs
parents:
diff changeset
   840
        }
hgs
parents:
diff changeset
   841
    //
hgs
parents:
diff changeset
   842
	return r;
hgs
parents:
diff changeset
   843
    }
hgs
parents:
diff changeset
   844
hgs
parents:
diff changeset
   845
hgs
parents:
diff changeset
   846
EXPORT_C TInt RMemSpyDriverClient::WalkHeapGetCellInfo( TAny*& aCellAddress, TMemSpyDriverCellType& aCellType, TInt& aLength, TInt& aNestingLevel, TInt& aAllocNumber, TInt& aCellHeaderSize, TAny*& aCellPayloadAddress )
hgs
parents:
diff changeset
   847
    {
hgs
parents:
diff changeset
   848
    aCellType = EMemSpyDriverBadCellMask;
hgs
parents:
diff changeset
   849
    aLength = 0;
hgs
parents:
diff changeset
   850
    aNestingLevel = 0;
hgs
parents:
diff changeset
   851
    aAllocNumber = 0;
hgs
parents:
diff changeset
   852
    aCellHeaderSize = 0;
hgs
parents:
diff changeset
   853
    aCellPayloadAddress = NULL;
hgs
parents:
diff changeset
   854
    //
hgs
parents:
diff changeset
   855
    TMemSpyDriverInternalWalkHeapParamsCell params;
hgs
parents:
diff changeset
   856
	const TInt r = DoControl( EMemSpyDriverOpCodeWalkHeapGetCellInfo, aCellAddress, &params );
hgs
parents:
diff changeset
   857
    //
hgs
parents:
diff changeset
   858
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   859
	    {
hgs
parents:
diff changeset
   860
        aCellAddress = params.iCellAddress;
hgs
parents:
diff changeset
   861
        aCellType = (TMemSpyDriverCellType) params.iCellType;
hgs
parents:
diff changeset
   862
        aLength = params.iLength;
hgs
parents:
diff changeset
   863
        aNestingLevel = params.iNestingLevel;
hgs
parents:
diff changeset
   864
        aAllocNumber = params.iAllocNumber;
hgs
parents:
diff changeset
   865
        aCellPayloadAddress = ((TUint8*) aCellAddress) + aCellHeaderSize;
hgs
parents:
diff changeset
   866
        }
hgs
parents:
diff changeset
   867
    //
hgs
parents:
diff changeset
   868
   	return r;
hgs
parents:
diff changeset
   869
    }
hgs
parents:
diff changeset
   870
hgs
parents:
diff changeset
   871
hgs
parents:
diff changeset
   872
EXPORT_C void RMemSpyDriverClient::WalkHeapClose()
hgs
parents:
diff changeset
   873
    {
hgs
parents:
diff changeset
   874
	DoControl( EMemSpyDriverOpCodeWalkHeapClose, NULL, NULL );
hgs
parents:
diff changeset
   875
    }
hgs
parents:
diff changeset
   876
hgs
parents:
diff changeset
   877
hgs
parents:
diff changeset
   878
hgs
parents:
diff changeset
   879
hgs
parents:
diff changeset
   880
hgs
parents:
diff changeset
   881
hgs
parents:
diff changeset
   882
hgs
parents:
diff changeset
   883
hgs
parents:
diff changeset
   884
hgs
parents:
diff changeset
   885
hgs
parents:
diff changeset
   886
hgs
parents:
diff changeset
   887
hgs
parents:
diff changeset
   888
hgs
parents:
diff changeset
   889
hgs
parents:
diff changeset
   890
hgs
parents:
diff changeset
   891
hgs
parents:
diff changeset
   892
hgs
parents:
diff changeset
   893
hgs
parents:
diff changeset
   894
hgs
parents:
diff changeset
   895
hgs
parents:
diff changeset
   896
hgs
parents:
diff changeset
   897
hgs
parents:
diff changeset
   898
hgs
parents:
diff changeset
   899
hgs
parents:
diff changeset
   900
hgs
parents:
diff changeset
   901
hgs
parents:
diff changeset
   902
hgs
parents:
diff changeset
   903
EXPORT_C TInt RMemSpyDriverClient::GetStackInfo( TUint aTid, TMemSpyDriverStackInfo& aInfo )
hgs
parents:
diff changeset
   904
    {
hgs
parents:
diff changeset
   905
    TMemSpyDriverStackInfo params;
hgs
parents:
diff changeset
   906
	const TInt r = DoControl( EMemSpyDriverOpCodeStackGetInfo, (TAny*)aTid, &params );
hgs
parents:
diff changeset
   907
	if  (r==KErrNone)
hgs
parents:
diff changeset
   908
		{
hgs
parents:
diff changeset
   909
		aInfo.iUserStackPointer = params.iUserStackPointer;
hgs
parents:
diff changeset
   910
		aInfo.iUserStackBase = params.iUserStackBase;
hgs
parents:
diff changeset
   911
		aInfo.iUserStackSize = params.iUserStackSize;
hgs
parents:
diff changeset
   912
		aInfo.iUserStackHighWatermark = params.iUserStackHighWatermark;
hgs
parents:
diff changeset
   913
		aInfo.iSupervisorStackPointer = params.iSupervisorStackPointer;
hgs
parents:
diff changeset
   914
		aInfo.iSupervisorStackBase = params.iSupervisorStackBase;
hgs
parents:
diff changeset
   915
		aInfo.iSupervisorStackSize = params.iSupervisorStackSize;
hgs
parents:
diff changeset
   916
		aInfo.iSupervisorStackHighWatermark = params.iSupervisorStackHighWatermark;
hgs
parents:
diff changeset
   917
		}
hgs
parents:
diff changeset
   918
	//
hgs
parents:
diff changeset
   919
	return r;
hgs
parents:
diff changeset
   920
    }    
hgs
parents:
diff changeset
   921
hgs
parents:
diff changeset
   922
hgs
parents:
diff changeset
   923
EXPORT_C TInt RMemSpyDriverClient::GetStackData( TUint aTid, TDes8& aDest, TUint& aAmountRemaining, TMemSpyDriverDomainType aDomain, TBool aEntireStack )
hgs
parents:
diff changeset
   924
    {
hgs
parents:
diff changeset
   925
    TMemSpyDriverInternalStackDataParams params;
hgs
parents:
diff changeset
   926
    params.iTid = aTid;
hgs
parents:
diff changeset
   927
    params.iDes = &aDest;
hgs
parents:
diff changeset
   928
    params.iDomain = aDomain;
hgs
parents:
diff changeset
   929
    params.iEntireStack = aEntireStack;
hgs
parents:
diff changeset
   930
    params.iRemaining = -1;
hgs
parents:
diff changeset
   931
    aDest.Zero();
hgs
parents:
diff changeset
   932
    //
hgs
parents:
diff changeset
   933
	TInt r = DoControl( EMemSpyDriverOpCodeStackGetData, &params, NULL );
hgs
parents:
diff changeset
   934
	//
hgs
parents:
diff changeset
   935
	if  ( r >= KErrNone )
hgs
parents:
diff changeset
   936
    	{
hgs
parents:
diff changeset
   937
        aDest.SetLength( r );
hgs
parents:
diff changeset
   938
    	aAmountRemaining = params.iRemaining;
hgs
parents:
diff changeset
   939
        r = KErrNone;
hgs
parents:
diff changeset
   940
    	}
hgs
parents:
diff changeset
   941
	//
hgs
parents:
diff changeset
   942
	return r;
hgs
parents:
diff changeset
   943
    }
hgs
parents:
diff changeset
   944
hgs
parents:
diff changeset
   945
hgs
parents:
diff changeset
   946
EXPORT_C TInt RMemSpyDriverClient::GetStackDataNext( TUint aTid, TDes8& aDest, TUint& aAmountRemaining, TMemSpyDriverDomainType aDomain, TBool aEntireStack )
hgs
parents:
diff changeset
   947
    {
hgs
parents:
diff changeset
   948
    TMemSpyDriverInternalStackDataParams params;
hgs
parents:
diff changeset
   949
    params.iTid = aTid;
hgs
parents:
diff changeset
   950
    params.iDes = &aDest;
hgs
parents:
diff changeset
   951
    params.iDomain = aDomain;
hgs
parents:
diff changeset
   952
    params.iEntireStack = aEntireStack;
hgs
parents:
diff changeset
   953
    params.iRemaining = aAmountRemaining;
hgs
parents:
diff changeset
   954
    //
hgs
parents:
diff changeset
   955
	TInt r = DoControl( EMemSpyDriverOpCodeStackGetData, &params, NULL );
hgs
parents:
diff changeset
   956
	//
hgs
parents:
diff changeset
   957
	if  ( r >= KErrNone )
hgs
parents:
diff changeset
   958
    	{
hgs
parents:
diff changeset
   959
        aDest.SetLength( r );
hgs
parents:
diff changeset
   960
    	aAmountRemaining = params.iRemaining;
hgs
parents:
diff changeset
   961
        r = KErrNone;
hgs
parents:
diff changeset
   962
    	}
hgs
parents:
diff changeset
   963
	//
hgs
parents:
diff changeset
   964
    return r;
hgs
parents:
diff changeset
   965
    }
hgs
parents:
diff changeset
   966
hgs
parents:
diff changeset
   967
hgs
parents:
diff changeset
   968
hgs
parents:
diff changeset
   969
hgs
parents:
diff changeset
   970
hgs
parents:
diff changeset
   971
hgs
parents:
diff changeset
   972
hgs
parents:
diff changeset
   973
hgs
parents:
diff changeset
   974
hgs
parents:
diff changeset
   975
hgs
parents:
diff changeset
   976
hgs
parents:
diff changeset
   977
hgs
parents:
diff changeset
   978
hgs
parents:
diff changeset
   979
hgs
parents:
diff changeset
   980
hgs
parents:
diff changeset
   981
hgs
parents:
diff changeset
   982
hgs
parents:
diff changeset
   983
hgs
parents:
diff changeset
   984
hgs
parents:
diff changeset
   985
hgs
parents:
diff changeset
   986
hgs
parents:
diff changeset
   987
hgs
parents:
diff changeset
   988
hgs
parents:
diff changeset
   989
hgs
parents:
diff changeset
   990
hgs
parents:
diff changeset
   991
hgs
parents:
diff changeset
   992
hgs
parents:
diff changeset
   993
hgs
parents:
diff changeset
   994
hgs
parents:
diff changeset
   995
hgs
parents:
diff changeset
   996
hgs
parents:
diff changeset
   997
hgs
parents:
diff changeset
   998
hgs
parents:
diff changeset
   999
hgs
parents:
diff changeset
  1000
hgs
parents:
diff changeset
  1001
hgs
parents:
diff changeset
  1002
hgs
parents:
diff changeset
  1003
hgs
parents:
diff changeset
  1004
hgs
parents:
diff changeset
  1005
hgs
parents:
diff changeset
  1006
hgs
parents:
diff changeset
  1007
hgs
parents:
diff changeset
  1008
hgs
parents:
diff changeset
  1009
hgs
parents:
diff changeset
  1010
hgs
parents:
diff changeset
  1011
hgs
parents:
diff changeset
  1012
hgs
parents:
diff changeset
  1013
hgs
parents:
diff changeset
  1014
hgs
parents:
diff changeset
  1015
hgs
parents:
diff changeset
  1016
hgs
parents:
diff changeset
  1017
hgs
parents:
diff changeset
  1018
hgs
parents:
diff changeset
  1019
hgs
parents:
diff changeset
  1020
hgs
parents:
diff changeset
  1021
hgs
parents:
diff changeset
  1022
hgs
parents:
diff changeset
  1023
hgs
parents:
diff changeset
  1024
hgs
parents:
diff changeset
  1025
hgs
parents:
diff changeset
  1026
hgs
parents:
diff changeset
  1027
hgs
parents:
diff changeset
  1028
hgs
parents:
diff changeset
  1029
EXPORT_C TInt RMemSpyDriverClient::EventMonitorOpen( TUint& aHandle )
hgs
parents:
diff changeset
  1030
    {
hgs
parents:
diff changeset
  1031
    const TInt error = DoControl( EMemSpyDriverOpCodeEventMonitorOpen, (TAny*) &aHandle );
hgs
parents:
diff changeset
  1032
    return error;
hgs
parents:
diff changeset
  1033
    }
hgs
parents:
diff changeset
  1034
hgs
parents:
diff changeset
  1035
hgs
parents:
diff changeset
  1036
EXPORT_C TInt RMemSpyDriverClient::EventMonitorClose( TUint aHandle )
hgs
parents:
diff changeset
  1037
    {
hgs
parents:
diff changeset
  1038
    const TInt error = DoControl( EMemSpyDriverOpCodeEventMonitorClose, (TAny*) aHandle );
hgs
parents:
diff changeset
  1039
    return error;
hgs
parents:
diff changeset
  1040
    }
hgs
parents:
diff changeset
  1041
hgs
parents:
diff changeset
  1042
hgs
parents:
diff changeset
  1043
EXPORT_C void RMemSpyDriverClient::EventMonitorNotify( TUint aHandle, TRequestStatus& aStatus, TUint& aContext )
hgs
parents:
diff changeset
  1044
    {
hgs
parents:
diff changeset
  1045
    aStatus = KRequestPending;
hgs
parents:
diff changeset
  1046
    //
hgs
parents:
diff changeset
  1047
    TMemSpyDriverInternalEventMonitorParams params;
hgs
parents:
diff changeset
  1048
    params.iHandle = aHandle;
hgs
parents:
diff changeset
  1049
    params.iStatus = &aStatus;
hgs
parents:
diff changeset
  1050
    params.iContext = (TAny*) &aContext;
hgs
parents:
diff changeset
  1051
    //
hgs
parents:
diff changeset
  1052
    const TInt err = DoControl( EMemSpyDriverOpCodeEventMonitorNotify, (TAny*) &params );
hgs
parents:
diff changeset
  1053
    if  ( err != KErrNone )
hgs
parents:
diff changeset
  1054
        {
hgs
parents:
diff changeset
  1055
        TRequestStatus* status = &aStatus;
hgs
parents:
diff changeset
  1056
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
  1057
        }
hgs
parents:
diff changeset
  1058
    }
hgs
parents:
diff changeset
  1059
hgs
parents:
diff changeset
  1060
hgs
parents:
diff changeset
  1061
EXPORT_C void RMemSpyDriverClient::EventMonitorNotifyCancel( TUint aHandle )
hgs
parents:
diff changeset
  1062
    {
hgs
parents:
diff changeset
  1063
    const TInt error = DoControl( EMemSpyDriverOpCodeEventMonitorNotifyCancel, (TAny*) aHandle );
hgs
parents:
diff changeset
  1064
    (void) error;
hgs
parents:
diff changeset
  1065
    }
hgs
parents:
diff changeset
  1066
hgs
parents:
diff changeset
  1067
hgs
parents:
diff changeset
  1068
hgs
parents:
diff changeset
  1069
hgs
parents:
diff changeset
  1070
hgs
parents:
diff changeset
  1071
hgs
parents:
diff changeset
  1072
hgs
parents:
diff changeset
  1073
hgs
parents:
diff changeset
  1074
hgs
parents:
diff changeset
  1075
hgs
parents:
diff changeset
  1076
hgs
parents:
diff changeset
  1077
hgs
parents:
diff changeset
  1078
hgs
parents:
diff changeset
  1079
hgs
parents:
diff changeset
  1080
hgs
parents:
diff changeset
  1081
hgs
parents:
diff changeset
  1082
hgs
parents:
diff changeset
  1083
hgs
parents:
diff changeset
  1084
hgs
parents:
diff changeset
  1085
EXPORT_C TInt RMemSpyDriverClient::ProcessInspectionOpen( TUint aPid )
hgs
parents:
diff changeset
  1086
    {
hgs
parents:
diff changeset
  1087
    const TInt error = DoControl( EMemSpyDriverOpCodeProcessInspectOpen, (TAny*) aPid );
hgs
parents:
diff changeset
  1088
    return error;
hgs
parents:
diff changeset
  1089
    }
hgs
parents:
diff changeset
  1090
hgs
parents:
diff changeset
  1091
hgs
parents:
diff changeset
  1092
EXPORT_C TInt RMemSpyDriverClient::ProcessInspectionClose( TUint aPid )
hgs
parents:
diff changeset
  1093
    {
hgs
parents:
diff changeset
  1094
    const TInt error = DoControl( EMemSpyDriverOpCodeProcessInspectClose, (TAny*) aPid );
hgs
parents:
diff changeset
  1095
    return error;
hgs
parents:
diff changeset
  1096
    }
hgs
parents:
diff changeset
  1097
hgs
parents:
diff changeset
  1098
hgs
parents:
diff changeset
  1099
EXPORT_C void RMemSpyDriverClient::ProcessInspectionRequestChanges( TUint aPid, TRequestStatus& aStatus, TMemSpyDriverProcessInspectionInfo& aInfo )
hgs
parents:
diff changeset
  1100
    {
hgs
parents:
diff changeset
  1101
    aInfo.iProcessId = aPid;
hgs
parents:
diff changeset
  1102
    aStatus = KRequestPending;
hgs
parents:
diff changeset
  1103
    const TInt err = DoControl( EMemSpyDriverOpCodeProcessInspectRequestChanges, (TAny*) &aStatus, (TAny*) &aInfo );
hgs
parents:
diff changeset
  1104
    if  ( err != KErrNone )
hgs
parents:
diff changeset
  1105
        {
hgs
parents:
diff changeset
  1106
        TRequestStatus* status = &aStatus;
hgs
parents:
diff changeset
  1107
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
  1108
        }
hgs
parents:
diff changeset
  1109
    }
hgs
parents:
diff changeset
  1110
hgs
parents:
diff changeset
  1111
hgs
parents:
diff changeset
  1112
EXPORT_C void RMemSpyDriverClient::ProcessInspectionRequestChangesCancel( TUint aPid )
hgs
parents:
diff changeset
  1113
    {
hgs
parents:
diff changeset
  1114
    const TInt error = DoControl( EMemSpyDriverOpCodeProcessInspectRequestChangesCancel, (TAny*) aPid );
hgs
parents:
diff changeset
  1115
    (void) error;
hgs
parents:
diff changeset
  1116
    }
hgs
parents:
diff changeset
  1117
hgs
parents:
diff changeset
  1118
hgs
parents:
diff changeset
  1119
EXPORT_C void RMemSpyDriverClient::ProcessInspectionAutoStartItemsReset()
hgs
parents:
diff changeset
  1120
    {
hgs
parents:
diff changeset
  1121
    const TInt error = DoControl( EMemSpyDriverOpCodeProcessInspectAutoStartListReset );
hgs
parents:
diff changeset
  1122
    (void) error;
hgs
parents:
diff changeset
  1123
    }
hgs
parents:
diff changeset
  1124
hgs
parents:
diff changeset
  1125
hgs
parents:
diff changeset
  1126
EXPORT_C TInt RMemSpyDriverClient::ProcessInspectionAutoStartItemsAdd( TUint aSID )
hgs
parents:
diff changeset
  1127
    {
hgs
parents:
diff changeset
  1128
    const TInt error = DoControl( EMemSpyDriverOpCodeProcessInspectAutoStartListAdd, (TAny*) aSID );
hgs
parents:
diff changeset
  1129
    return error;
hgs
parents:
diff changeset
  1130
    }
hgs
parents:
diff changeset
  1131
hgs
parents:
diff changeset
  1132
hgs
parents:
diff changeset
  1133
hgs
parents:
diff changeset
  1134
hgs
parents:
diff changeset
  1135
hgs
parents:
diff changeset
  1136
hgs
parents:
diff changeset
  1137
hgs
parents:
diff changeset
  1138
hgs
parents:
diff changeset
  1139
hgs
parents:
diff changeset
  1140
hgs
parents:
diff changeset
  1141
hgs
parents:
diff changeset
  1142
hgs
parents:
diff changeset
  1143
hgs
parents:
diff changeset
  1144
hgs
parents:
diff changeset
  1145
hgs
parents:
diff changeset
  1146
hgs
parents:
diff changeset
  1147
hgs
parents:
diff changeset
  1148
hgs
parents:
diff changeset
  1149
hgs
parents:
diff changeset
  1150
hgs
parents:
diff changeset
  1151
hgs
parents:
diff changeset
  1152
hgs
parents:
diff changeset
  1153
EXPORT_C TInt RMemSpyDriverClient::GetContainerHandles( TMemSpyDriverContainerType aContainer, TAny** aHandleArray, TInt& aHandleCount )
hgs
parents:
diff changeset
  1154
    {
hgs
parents:
diff changeset
  1155
	TMemSpyDriverInternalContainerHandleParams params;
hgs
parents:
diff changeset
  1156
	params.iTidOrPid = KMemSpyDriverEnumerateContainerHandles;
hgs
parents:
diff changeset
  1157
	params.iContainer = aContainer;
hgs
parents:
diff changeset
  1158
	params.iHandles = aHandleArray;
hgs
parents:
diff changeset
  1159
	params.iCountPtr = &aHandleCount;
hgs
parents:
diff changeset
  1160
    params.iMaxCount = aHandleCount;
hgs
parents:
diff changeset
  1161
    params.iHandleSource = EMemSpyDriverThreadOrProcessTypeThread; // Not used
hgs
parents:
diff changeset
  1162
    //
hgs
parents:
diff changeset
  1163
    aHandleCount = 0;
hgs
parents:
diff changeset
  1164
	//
hgs
parents:
diff changeset
  1165
	return DoControl( EMemSpyDriverOpCodeContainersGetHandles, &params, NULL );
hgs
parents:
diff changeset
  1166
    }
hgs
parents:
diff changeset
  1167
hgs
parents:
diff changeset
  1168
hgs
parents:
diff changeset
  1169
EXPORT_C TInt RMemSpyDriverClient::GetThreadHandlesByType( TInt aTid, TMemSpyDriverContainerType aType, TAny** aHandleArray, TInt& aHandleCount )
hgs
parents:
diff changeset
  1170
    {
hgs
parents:
diff changeset
  1171
	TMemSpyDriverInternalContainerHandleParams params;
hgs
parents:
diff changeset
  1172
	params.iTidOrPid = aTid;
hgs
parents:
diff changeset
  1173
	params.iContainer = aType;
hgs
parents:
diff changeset
  1174
	params.iHandles = aHandleArray;
hgs
parents:
diff changeset
  1175
	params.iCountPtr = &aHandleCount;
hgs
parents:
diff changeset
  1176
    params.iMaxCount = aHandleCount;
hgs
parents:
diff changeset
  1177
    params.iHandleSource = EMemSpyDriverThreadOrProcessTypeThread;
hgs
parents:
diff changeset
  1178
	//
hgs
parents:
diff changeset
  1179
    aHandleCount = 0;
hgs
parents:
diff changeset
  1180
    //
hgs
parents:
diff changeset
  1181
	return DoControl( EMemSpyDriverOpCodeContainersGetHandles, &params, NULL );
hgs
parents:
diff changeset
  1182
    }
hgs
parents:
diff changeset
  1183
hgs
parents:
diff changeset
  1184
hgs
parents:
diff changeset
  1185
EXPORT_C TInt RMemSpyDriverClient::GetProcessHandlesByType( TInt aPid, TMemSpyDriverContainerType aType, TAny** aHandleArray, TInt& aHandleCount )
hgs
parents:
diff changeset
  1186
    {
hgs
parents:
diff changeset
  1187
	TMemSpyDriverInternalContainerHandleParams params;
hgs
parents:
diff changeset
  1188
	params.iTidOrPid = aPid;
hgs
parents:
diff changeset
  1189
	params.iContainer = aType;
hgs
parents:
diff changeset
  1190
	params.iHandles = aHandleArray;
hgs
parents:
diff changeset
  1191
	params.iCountPtr = &aHandleCount;
hgs
parents:
diff changeset
  1192
    params.iMaxCount = aHandleCount;
hgs
parents:
diff changeset
  1193
    params.iHandleSource = EMemSpyDriverThreadOrProcessTypeProcess;
hgs
parents:
diff changeset
  1194
	//
hgs
parents:
diff changeset
  1195
    aHandleCount = 0;
hgs
parents:
diff changeset
  1196
    //
hgs
parents:
diff changeset
  1197
	return DoControl( EMemSpyDriverOpCodeContainersGetHandles, &params, NULL );
hgs
parents:
diff changeset
  1198
    }
hgs
parents:
diff changeset
  1199
hgs
parents:
diff changeset
  1200
hgs
parents:
diff changeset
  1201
EXPORT_C TInt RMemSpyDriverClient::GetGenericHandleInfo( TInt aTid, TMemSpyDriverContainerType aType, TAny* aHandle, TMemSpyDriverHandleInfoGeneric& aParams )
hgs
parents:
diff changeset
  1202
    {
hgs
parents:
diff changeset
  1203
    aParams.iType = aType;
hgs
parents:
diff changeset
  1204
    aParams.iHandle = aHandle;
hgs
parents:
diff changeset
  1205
    //
hgs
parents:
diff changeset
  1206
    const TInt r = DoControl( EMemSpyDriverOpCodeContainersGetHandleInfo, (TAny*) aTid, &aParams );
hgs
parents:
diff changeset
  1207
    return r;
hgs
parents:
diff changeset
  1208
    }
hgs
parents:
diff changeset
  1209
hgs
parents:
diff changeset
  1210
hgs
parents:
diff changeset
  1211
EXPORT_C TInt RMemSpyDriverClient::GetApproximateKernelObjectSize( TMemSpyDriverContainerType aType )
hgs
parents:
diff changeset
  1212
    {
hgs
parents:
diff changeset
  1213
    TInt size = 0;
hgs
parents:
diff changeset
  1214
    const TInt error = DoControl( EMemSpyDriverOpCodeContainersGetApproxSize, (TAny*) aType, (TAny*) &size );
hgs
parents:
diff changeset
  1215
    (void) error;
hgs
parents:
diff changeset
  1216
    //
hgs
parents:
diff changeset
  1217
    return size;
hgs
parents:
diff changeset
  1218
    }
hgs
parents:
diff changeset
  1219
hgs
parents:
diff changeset
  1220
hgs
parents:
diff changeset
  1221
EXPORT_C TInt RMemSpyDriverClient::GetReferencesToMyThread( TUint aTid )
hgs
parents:
diff changeset
  1222
    {
hgs
parents:
diff changeset
  1223
    ResetStreamBuffer();
hgs
parents:
diff changeset
  1224
	return DoControl( EMemSpyDriverOpCodeContainersGetReferencesToMyThread, (TAny*) aTid, (TAny*) &iBuffer );
hgs
parents:
diff changeset
  1225
    }
hgs
parents:
diff changeset
  1226
hgs
parents:
diff changeset
  1227
hgs
parents:
diff changeset
  1228
EXPORT_C TInt RMemSpyDriverClient::GetReferencesToMyProcess( TUint aPid )
hgs
parents:
diff changeset
  1229
    {
hgs
parents:
diff changeset
  1230
    ResetStreamBuffer();
hgs
parents:
diff changeset
  1231
	return DoControl( EMemSpyDriverOpCodeContainersGetReferencesToMyProcess, (TAny*) aPid, (TAny*) &iBuffer );
hgs
parents:
diff changeset
  1232
    }
hgs
parents:
diff changeset
  1233
hgs
parents:
diff changeset
  1234
hgs
parents:
diff changeset
  1235
EXPORT_C TInt RMemSpyDriverClient::GetPAndSInfo( TAny* aHandle, TMemSpyDriverPAndSInfo& aInfo )
hgs
parents:
diff changeset
  1236
    {
hgs
parents:
diff changeset
  1237
    const TInt r = DoControl( EMemSpyDriverOpCodeContainersGetPAndSInfo, (TAny*) aHandle, &aInfo );
hgs
parents:
diff changeset
  1238
    return r;
hgs
parents:
diff changeset
  1239
    }
hgs
parents:
diff changeset
  1240
hgs
parents:
diff changeset
  1241
hgs
parents:
diff changeset
  1242
EXPORT_C TInt RMemSpyDriverClient::GetCondVarSuspendedThreads( TAny* aCondVarHandle, TAny** aThreadHandleArray, TInt& aThreadCount )
hgs
parents:
diff changeset
  1243
    {
hgs
parents:
diff changeset
  1244
    TMemSpyDriverInternalCondVarSuspendedThreadParams params;
hgs
parents:
diff changeset
  1245
    params.iCondVarHandle = aCondVarHandle;
hgs
parents:
diff changeset
  1246
    params.iThrHandles = aThreadHandleArray;
hgs
parents:
diff changeset
  1247
    params.iThrCountPtr = &aThreadCount;
hgs
parents:
diff changeset
  1248
    params.iMaxCount = aThreadCount;
hgs
parents:
diff changeset
  1249
    //
hgs
parents:
diff changeset
  1250
    aThreadCount = 0;
hgs
parents:
diff changeset
  1251
    //
hgs
parents:
diff changeset
  1252
    return DoControl( EMemSpyDriverOpCodeContainersGetCondVarSuspendedThreads, &params, NULL );
hgs
parents:
diff changeset
  1253
    }
hgs
parents:
diff changeset
  1254
hgs
parents:
diff changeset
  1255
hgs
parents:
diff changeset
  1256
EXPORT_C TInt RMemSpyDriverClient::GetCondVarSuspendedThreadInfo( TAny* aHandle, TMemSpyDriverCondVarSuspendedThreadInfo& aParams )
hgs
parents:
diff changeset
  1257
    {
hgs
parents:
diff changeset
  1258
    return DoControl( EMemSpyDriverOpCodeContainersGetCondVarSuspendedThreadInfo, aHandle, &aParams );
hgs
parents:
diff changeset
  1259
    }
hgs
parents:
diff changeset
  1260
hgs
parents:
diff changeset
  1261
hgs
parents:
diff changeset
  1262
hgs
parents:
diff changeset
  1263
hgs
parents:
diff changeset
  1264
hgs
parents:
diff changeset
  1265
hgs
parents:
diff changeset
  1266
hgs
parents:
diff changeset
  1267
hgs
parents:
diff changeset
  1268
hgs
parents:
diff changeset
  1269
hgs
parents:
diff changeset
  1270
hgs
parents:
diff changeset
  1271
hgs
parents:
diff changeset
  1272
hgs
parents:
diff changeset
  1273
hgs
parents:
diff changeset
  1274
hgs
parents:
diff changeset
  1275
hgs
parents:
diff changeset
  1276
hgs
parents:
diff changeset
  1277
EXPORT_C TInt RMemSpyDriverClient::GetServerSessionHandles( TAny* aServerHandle, TAny** aSessionHandleArray, TInt& aSessionHandleCount )
hgs
parents:
diff changeset
  1278
    {
hgs
parents:
diff changeset
  1279
	TMemSpyDriverInternalServerSessionHandleParams params;
hgs
parents:
diff changeset
  1280
	params.iServerHandle = aServerHandle;
hgs
parents:
diff changeset
  1281
	params.iSessionHandles = aSessionHandleArray;
hgs
parents:
diff changeset
  1282
	params.iSessionCountPtr = &aSessionHandleCount;
hgs
parents:
diff changeset
  1283
    params.iMaxCount = aSessionHandleCount;
hgs
parents:
diff changeset
  1284
    //
hgs
parents:
diff changeset
  1285
    aSessionHandleCount = 0;
hgs
parents:
diff changeset
  1286
	//
hgs
parents:
diff changeset
  1287
	return DoControl( EMemSpyDriverOpCodeClientServerGetServerSessionHandles, &params, NULL );
hgs
parents:
diff changeset
  1288
    }
hgs
parents:
diff changeset
  1289
hgs
parents:
diff changeset
  1290
hgs
parents:
diff changeset
  1291
EXPORT_C TInt RMemSpyDriverClient::GetServerSessionInfo( TAny* aSessionHandle, TMemSpyDriverServerSessionInfo& aParams )
hgs
parents:
diff changeset
  1292
    {
hgs
parents:
diff changeset
  1293
    return DoControl( EMemSpyDriverOpCodeClientServerGetServerSessionInfo, aSessionHandle, &aParams );
hgs
parents:
diff changeset
  1294
    }
hgs
parents:
diff changeset
  1295
hgs
parents:
diff changeset
  1296
hgs
parents:
diff changeset
  1297
hgs
parents:
diff changeset
  1298
hgs
parents:
diff changeset
  1299
hgs
parents:
diff changeset
  1300
hgs
parents:
diff changeset
  1301
hgs
parents:
diff changeset
  1302
hgs
parents:
diff changeset
  1303
hgs
parents:
diff changeset
  1304
hgs
parents:
diff changeset
  1305
hgs
parents:
diff changeset
  1306
EXPORT_C RMemSpyMemStreamReader RMemSpyDriverClient::StreamOpenL()
hgs
parents:
diff changeset
  1307
    {
hgs
parents:
diff changeset
  1308
    CMemSpyMemStreamReader* imp = new(ELeave) CMemSpyMemStreamReader( iBuffer );
hgs
parents:
diff changeset
  1309
    RMemSpyMemStreamReader ret( imp );
hgs
parents:
diff changeset
  1310
    CleanupClosePushL( ret ); 
hgs
parents:
diff changeset
  1311
    imp->ConstructL();
hgs
parents:
diff changeset
  1312
    CleanupStack::Pop( &ret );
hgs
parents:
diff changeset
  1313
    return ret;
hgs
parents:
diff changeset
  1314
    }
hgs
parents:
diff changeset
  1315
hgs
parents:
diff changeset
  1316
hgs
parents:
diff changeset
  1317
hgs
parents:
diff changeset
  1318
hgs
parents:
diff changeset
  1319
hgs
parents:
diff changeset
  1320
hgs
parents:
diff changeset
  1321
hgs
parents:
diff changeset
  1322
hgs
parents:
diff changeset
  1323
hgs
parents:
diff changeset
  1324
hgs
parents:
diff changeset
  1325
hgs
parents:
diff changeset
  1326
hgs
parents:
diff changeset
  1327
hgs
parents:
diff changeset
  1328
EXPORT_C TMemSpyMemoryModelType RMemSpyDriverClient::MemoryModelType()
hgs
parents:
diff changeset
  1329
    {
hgs
parents:
diff changeset
  1330
    TMemSpyMemoryModelType ret = EMemSpyMemoryModelTypeUnknown;
hgs
parents:
diff changeset
  1331
    //
hgs
parents:
diff changeset
  1332
    const TInt err = DoControl( EMemSpyDriverOpCodeMiscGetMemoryModelType );
hgs
parents:
diff changeset
  1333
    switch( err )
hgs
parents:
diff changeset
  1334
        {
hgs
parents:
diff changeset
  1335
    default:
hgs
parents:
diff changeset
  1336
    case EMemSpyMemoryModelTypeUnknown:
hgs
parents:
diff changeset
  1337
        ret = EMemSpyMemoryModelTypeUnknown;
hgs
parents:
diff changeset
  1338
        break;
hgs
parents:
diff changeset
  1339
    case EMemSpyMemoryModelTypeMoving:
hgs
parents:
diff changeset
  1340
        ret = EMemSpyMemoryModelTypeMoving;
hgs
parents:
diff changeset
  1341
        break;
hgs
parents:
diff changeset
  1342
    case EMemSpyMemoryModelTypeMultiple:
hgs
parents:
diff changeset
  1343
        ret = EMemSpyMemoryModelTypeMultiple;
hgs
parents:
diff changeset
  1344
        break;
hgs
parents:
diff changeset
  1345
    case EMemSpyMemoryModelTypeEmulator:
hgs
parents:
diff changeset
  1346
        ret = EMemSpyMemoryModelTypeEmulator;
hgs
parents:
diff changeset
  1347
        break;
hgs
parents:
diff changeset
  1348
        }
hgs
parents:
diff changeset
  1349
    //
hgs
parents:
diff changeset
  1350
    return ret;
hgs
parents:
diff changeset
  1351
    }
hgs
parents:
diff changeset
  1352
hgs
parents:
diff changeset
  1353
hgs
parents:
diff changeset
  1354
EXPORT_C TUint32 RMemSpyDriverClient::RoundToPageSize( TUint32 aValue )
hgs
parents:
diff changeset
  1355
    {
hgs
parents:
diff changeset
  1356
    TUint32 temp = aValue;
hgs
parents:
diff changeset
  1357
    TAny* pValue = (TAny*) &temp;
hgs
parents:
diff changeset
  1358
    DoControl( EMemSpyDriverOpCodeMiscGetRoundToPageSize, pValue );
hgs
parents:
diff changeset
  1359
    return temp;
hgs
parents:
diff changeset
  1360
    }
hgs
parents:
diff changeset
  1361
hgs
parents:
diff changeset
  1362
hgs
parents:
diff changeset
  1363
EXPORT_C TInt RMemSpyDriverClient::Impersonate( TUint32 aValue )
hgs
parents:
diff changeset
  1364
    {
hgs
parents:
diff changeset
  1365
    return DoControl( EMemSpyDriverOpCodeMiscImpersonate, (TAny*) aValue );
hgs
parents:
diff changeset
  1366
    }
hgs
parents:
diff changeset
  1367
hgs
parents:
diff changeset
  1368
hgs
parents:
diff changeset
  1369
hgs
parents:
diff changeset
  1370
hgs
parents:
diff changeset
  1371
hgs
parents:
diff changeset
  1372
hgs
parents:
diff changeset
  1373
hgs
parents:
diff changeset
  1374
hgs
parents:
diff changeset
  1375
hgs
parents:
diff changeset
  1376
hgs
parents:
diff changeset
  1377
hgs
parents:
diff changeset
  1378
hgs
parents:
diff changeset
  1379
hgs
parents:
diff changeset
  1380
hgs
parents:
diff changeset
  1381
hgs
parents:
diff changeset
  1382
hgs
parents:
diff changeset
  1383
hgs
parents:
diff changeset
  1384
hgs
parents:
diff changeset
  1385
hgs
parents:
diff changeset
  1386
hgs
parents:
diff changeset
  1387
hgs
parents:
diff changeset
  1388
hgs
parents:
diff changeset
  1389
hgs
parents:
diff changeset
  1390
hgs
parents:
diff changeset
  1391
hgs
parents:
diff changeset
  1392
hgs
parents:
diff changeset
  1393
TUint RMemSpyDriverClient::RHeapVTable()
hgs
parents:
diff changeset
  1394
    {
hgs
parents:
diff changeset
  1395
    RHeap* heap = (RHeap*) &User::Allocator();
hgs
parents:
diff changeset
  1396
    //
hgs
parents:
diff changeset
  1397
    TUint* pHeap = (TUint*) heap;
hgs
parents:
diff changeset
  1398
    const TUint heapVTable = *pHeap;
hgs
parents:
diff changeset
  1399
    //
hgs
parents:
diff changeset
  1400
    ////RDebug::Printf( "[MemSpy] RMemSpyDriverClient::RHeapVTable() - ret: 0x%08x", heapVTable );
hgs
parents:
diff changeset
  1401
    return heapVTable;
hgs
parents:
diff changeset
  1402
    }
hgs
parents:
diff changeset
  1403
hgs
parents:
diff changeset
  1404
hgs
parents:
diff changeset
  1405
TBool RMemSpyDriverClient::DebugEUser()
hgs
parents:
diff changeset
  1406
    {
hgs
parents:
diff changeset
  1407
	LtkUtils::RAllocatorHelper allocHelper;
hgs
parents:
diff changeset
  1408
	TBool result = EFalse;
hgs
parents:
diff changeset
  1409
	TInt err = allocHelper.Open(&User::Allocator());
hgs
parents:
diff changeset
  1410
	if (!err)
hgs
parents:
diff changeset
  1411
		{
hgs
parents:
diff changeset
  1412
		result = allocHelper.AllocatorIsUdeb();
hgs
parents:
diff changeset
  1413
		allocHelper.Close();
hgs
parents:
diff changeset
  1414
		}
hgs
parents:
diff changeset
  1415
	return result;
hgs
parents:
diff changeset
  1416
    }
hgs
parents:
diff changeset
  1417
hgs
parents:
diff changeset
  1418
hgs
parents:
diff changeset
  1419
void RMemSpyDriverClient::ResetStreamBuffer()
hgs
parents:
diff changeset
  1420
    {
hgs
parents:
diff changeset
  1421
    iBuffer.Zero();
hgs
parents:
diff changeset
  1422
    }
hgs
parents:
diff changeset
  1423
hgs
parents:
diff changeset
  1424
hgs
parents:
diff changeset
  1425
void RMemSpyDriverClient::ReadHeapInfoFreeCellsFromXferBufferL( RArray<TMemSpyDriverFreeCell>& aFreeCells )
hgs
parents:
diff changeset
  1426
    {
hgs
parents:
diff changeset
  1427
    aFreeCells.Reset();
hgs
parents:
diff changeset
  1428
hgs
parents:
diff changeset
  1429
#ifdef _DEBUG
hgs
parents:
diff changeset
  1430
    RDebug::Printf( "[MemSpy] RMemSpyDriverClient::ReadHeapInfoFreeCellsFromXferBufferL() - buf len: %d", iBuffer.Length() );
hgs
parents:
diff changeset
  1431
#endif
hgs
parents:
diff changeset
  1432
hgs
parents:
diff changeset
  1433
    if  ( iBuffer.Length() )
hgs
parents:
diff changeset
  1434
        {
hgs
parents:
diff changeset
  1435
        RMemSpyMemStreamReader stream = StreamOpenL();
hgs
parents:
diff changeset
  1436
        CleanupClosePushL( stream );
hgs
parents:
diff changeset
  1437
hgs
parents:
diff changeset
  1438
        const TInt count = stream.ReadInt32L();
hgs
parents:
diff changeset
  1439
#ifdef _DEBUG
hgs
parents:
diff changeset
  1440
        RDebug::Printf( "[MemSpy] RMemSpyDriverClient::ReadHeapInfoFreeCellsFromXferBufferL() - count: %d", count );
hgs
parents:
diff changeset
  1441
#endif
hgs
parents:
diff changeset
  1442
hgs
parents:
diff changeset
  1443
        for( TInt i=0; i<count; i++ )
hgs
parents:
diff changeset
  1444
            {
hgs
parents:
diff changeset
  1445
            TMemSpyDriverFreeCell entry;
hgs
parents:
diff changeset
  1446
            entry.iType = (TMemSpyDriverCellType)stream.ReadInt32L();
hgs
parents:
diff changeset
  1447
            entry.iAddress = reinterpret_cast< TAny* >( stream.ReadUint32L() );
hgs
parents:
diff changeset
  1448
            entry.iLength = stream.ReadInt32L();
hgs
parents:
diff changeset
  1449
            aFreeCells.AppendL( entry );
hgs
parents:
diff changeset
  1450
            }
hgs
parents:
diff changeset
  1451
hgs
parents:
diff changeset
  1452
        CleanupStack::PopAndDestroy( &stream );
hgs
parents:
diff changeset
  1453
        }
hgs
parents:
diff changeset
  1454
hgs
parents:
diff changeset
  1455
    ResetStreamBuffer();
hgs
parents:
diff changeset
  1456
    }
hgs
parents:
diff changeset
  1457
hgs
parents:
diff changeset
  1458
hgs
parents:
diff changeset
  1459
hgs
parents:
diff changeset
  1460
hgs
parents:
diff changeset
  1461
hgs
parents:
diff changeset
  1462
hgs
parents:
diff changeset
  1463
hgs
parents:
diff changeset
  1464
hgs
parents:
diff changeset
  1465
hgs
parents:
diff changeset
  1466
hgs
parents:
diff changeset
  1467
hgs
parents:
diff changeset
  1468
hgs
parents:
diff changeset
  1469
static void PrintHeapInfo( const TMemSpyHeapInfo& aInfo )
hgs
parents:
diff changeset
  1470
    {
hgs
parents:
diff changeset
  1471
#if defined( _DEBUG ) && !defined( __WINS__ )
hgs
parents:
diff changeset
  1472
    const TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
hgs
parents:
diff changeset
  1473
    //const TMemSpyHeapObjectDataRHeap& rHeapObjectData = rHeapInfo.ObjectData();
hgs
parents:
diff changeset
  1474
    const TMemSpyHeapStatisticsRHeap& rHeapStats = rHeapInfo.Statistics();
hgs
parents:
diff changeset
  1475
    const TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
hgs
parents:
diff changeset
  1476
hgs
parents:
diff changeset
  1477
	/*
hgs
parents:
diff changeset
  1478
	 * TODO update to reflect new memory allocator structs etc
hgs
parents:
diff changeset
  1479
	 * 
hgs
parents:
diff changeset
  1480
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
hgs
parents:
diff changeset
  1481
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RAllocator                                      -");
hgs
parents:
diff changeset
  1482
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
hgs
parents:
diff changeset
  1483
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RAllocator::iAccessCount:       %d", rHeapObjectData.iAccessCount);
hgs
parents:
diff changeset
  1484
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RAllocator::iHandleCount:       %d", rHeapObjectData.iHandleCount);
hgs
parents:
diff changeset
  1485
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RAllocator::iHandles:           0x%08x", rHeapObjectData.iHandles);
hgs
parents:
diff changeset
  1486
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RAllocator::iFlags:             0x%08x", rHeapObjectData.iFlags);
hgs
parents:
diff changeset
  1487
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RAllocator::iCellCount:         %d", rHeapObjectData.iCellCount);
hgs
parents:
diff changeset
  1488
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RAllocator::iTotalAllocSize:    %d", rHeapObjectData.iTotalAllocSize);
hgs
parents:
diff changeset
  1489
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - ");
hgs
parents:
diff changeset
  1490
hgs
parents:
diff changeset
  1491
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
hgs
parents:
diff changeset
  1492
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap                                           -");
hgs
parents:
diff changeset
  1493
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
hgs
parents:
diff changeset
  1494
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iMinLength:              %d", rHeapObjectData.iMinLength);
hgs
parents:
diff changeset
  1495
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iMaxLength:              %d", rHeapObjectData.iMaxLength);
hgs
parents:
diff changeset
  1496
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iOffset:                 %d", rHeapObjectData.iOffset);
hgs
parents:
diff changeset
  1497
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iGrowBy:                 %d", rHeapObjectData.iGrowBy);
hgs
parents:
diff changeset
  1498
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iChunkHandle:            0x%08x", rHeapObjectData.iChunkHandle);
hgs
parents:
diff changeset
  1499
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iBase:                   0x%08x", rHeapObjectData.iBase);
hgs
parents:
diff changeset
  1500
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iTop:                    0x%08x", rHeapObjectData.iTop);
hgs
parents:
diff changeset
  1501
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iAlign:                  %d", rHeapObjectData.iAlign);
hgs
parents:
diff changeset
  1502
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iMinCell:                %d", rHeapObjectData.iAlign);
hgs
parents:
diff changeset
  1503
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iPageSize:               %d", rHeapObjectData.iAlign);
hgs
parents:
diff changeset
  1504
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iFree.next:              0x%08x", rHeapObjectData.iFree.next);
hgs
parents:
diff changeset
  1505
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iFree.len:               %d", rHeapObjectData.iFree.len);
hgs
parents:
diff changeset
  1506
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iNestingLevel:           %d", rHeapObjectData.iNestingLevel);
hgs
parents:
diff changeset
  1507
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iAllocCount:             %d", rHeapObjectData.iAllocCount);
hgs
parents:
diff changeset
  1508
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iFailType:               %d", rHeapObjectData.iFailType);
hgs
parents:
diff changeset
  1509
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iFailRate:               %d", rHeapObjectData.iFailRate);
hgs
parents:
diff changeset
  1510
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iFailed:                 %d", rHeapObjectData.iFailed);
hgs
parents:
diff changeset
  1511
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iFailAllocCount:         %d", rHeapObjectData.iFailAllocCount);
hgs
parents:
diff changeset
  1512
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iRand:                   %d", rHeapObjectData.iRand);
hgs
parents:
diff changeset
  1513
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iTestData:               0x%08x", rHeapObjectData.iTestData);
hgs
parents:
diff changeset
  1514
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - ");
hgs
parents:
diff changeset
  1515
	*/
hgs
parents:
diff changeset
  1516
hgs
parents:
diff changeset
  1517
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
hgs
parents:
diff changeset
  1518
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - Stats (Free)                                    -");
hgs
parents:
diff changeset
  1519
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
hgs
parents:
diff changeset
  1520
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell count:                     %d", rHeapStats.StatsFree().TypeCount());
hgs
parents:
diff changeset
  1521
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell size:                      %d", rHeapStats.StatsFree().TypeSize());
hgs
parents:
diff changeset
  1522
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell largest:                   0x%08x", rHeapStats.StatsFree().LargestCellAddress());
hgs
parents:
diff changeset
  1523
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell largest size:              %d", rHeapStats.StatsFree().LargestCellSize());
hgs
parents:
diff changeset
  1524
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - slack:                          0x%08x", rHeapStats.StatsFree().SlackSpaceCellAddress());
hgs
parents:
diff changeset
  1525
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - slack size:                     %d", rHeapStats.StatsFree().SlackSpaceCellSize());
hgs
parents:
diff changeset
  1526
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - checksum:                       0x%08x", rHeapStats.StatsFree().Checksum());
hgs
parents:
diff changeset
  1527
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - ");
hgs
parents:
diff changeset
  1528
hgs
parents:
diff changeset
  1529
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
hgs
parents:
diff changeset
  1530
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - Stats (Alloc)                                   -");
hgs
parents:
diff changeset
  1531
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
hgs
parents:
diff changeset
  1532
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell count:                     %d", rHeapStats.StatsAllocated().TypeCount());
hgs
parents:
diff changeset
  1533
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell size:                      %d", rHeapStats.StatsAllocated().TypeSize());
hgs
parents:
diff changeset
  1534
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell largest:                   0x%08x", rHeapStats.StatsAllocated().LargestCellAddress());
hgs
parents:
diff changeset
  1535
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell largest size:              %d", rHeapStats.StatsAllocated().LargestCellSize());
hgs
parents:
diff changeset
  1536
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - ");
hgs
parents:
diff changeset
  1537
hgs
parents:
diff changeset
  1538
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
hgs
parents:
diff changeset
  1539
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - Misc. Info                                      -");
hgs
parents:
diff changeset
  1540
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
hgs
parents:
diff changeset
  1541
    const TPtrC chunkName( rHeapMetaData.ChunkName() );
hgs
parents:
diff changeset
  1542
    RDebug::Print(_L("RMemSpyDriverClient::PrintHeapInfo() - chunk name:                     [%S]"), &chunkName );
hgs
parents:
diff changeset
  1543
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - chunk size:                     %d", rHeapMetaData.ChunkSize());
hgs
parents:
diff changeset
  1544
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - chunk handle:                   0x%08x", rHeapMetaData.ChunkHandle());
hgs
parents:
diff changeset
  1545
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - chunk base address:             0x%08x", rHeapMetaData.ChunkBaseAddress());
hgs
parents:
diff changeset
  1546
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - debug allocator:                %d", rHeapMetaData.IsDebugAllocator());
hgs
parents:
diff changeset
  1547
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - shared heap:                    %d", rHeapMetaData.IsSharedHeap() );
hgs
parents:
diff changeset
  1548
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - user thread:                    %d", rHeapMetaData.IsUserThread() );
hgs
parents:
diff changeset
  1549
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - thread id:                      %d", aInfo.Tid() );
hgs
parents:
diff changeset
  1550
    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - process id:                     %d", aInfo.Pid() );
hgs
parents:
diff changeset
  1551
    //RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell header size (free):        %d", rHeapMetaData.HeaderSizeFree());
hgs
parents:
diff changeset
  1552
    //RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell header size (alloc):       %d", rHeapMetaData.HeaderSizeAllocated());
hgs
parents:
diff changeset
  1553
#else
hgs
parents:
diff changeset
  1554
    (void) aInfo;
hgs
parents:
diff changeset
  1555
#endif
hgs
parents:
diff changeset
  1556
    }
hgs
parents:
diff changeset
  1557