perfsrv/memspy/MemSpyClient/src/memspysession.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
hgs
parents:
diff changeset
    19
#include "memspysession.h"
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include <memspyengineclientinterface.h>
hgs
parents:
diff changeset
    22
// API
hgs
parents:
diff changeset
    23
#include <memspy/engine/memspyprocessdata.h>
hgs
parents:
diff changeset
    24
#include <memspy/engine/memspythreaddata.h> 
hgs
parents:
diff changeset
    25
#include <memspy/engine/memspykernelobjectdata.h>
hgs
parents:
diff changeset
    26
#include <memspy/engine/memspyheapdata.h>
hgs
parents:
diff changeset
    27
#include <memspy/engine/memspymemorytrackingcycledata.h>
hgs
parents:
diff changeset
    28
//KernelObjects
hgs
parents:
diff changeset
    29
#include <memspy/driver/memspydriverenumerationsshared.h>
hgs
parents:
diff changeset
    30
// Servers
hgs
parents:
diff changeset
    31
#include <memspy/engine/memspyserverdata.h>
hgs
parents:
diff changeset
    32
// ECom
hgs
parents:
diff changeset
    33
#include <memspy/engine/memspyecomdata.h>
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
// IMPLEMENTATION
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
EXPORT_C RMemSpySession::RMemSpySession()
hgs
parents:
diff changeset
    38
    {
hgs
parents:
diff changeset
    39
    }
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
EXPORT_C TInt RMemSpySession::Connect()
hgs
parents:
diff changeset
    43
    {
hgs
parents:
diff changeset
    44
	TInt error(KErrNone);
hgs
parents:
diff changeset
    45
	
hgs
parents:
diff changeset
    46
	for (TInt i=0; i<2; i++) // Two retries max
hgs
parents:
diff changeset
    47
		{
hgs
parents:
diff changeset
    48
		TInt error = CreateSession(KMemSpyServerName, TVersion(KMemSpyVersion, 0, 0));
hgs
parents:
diff changeset
    49
		
hgs
parents:
diff changeset
    50
		if (error != KErrNotFound && error != KErrServerTerminated)
hgs
parents:
diff changeset
    51
			return error;
hgs
parents:
diff changeset
    52
		
hgs
parents:
diff changeset
    53
		error = StartServer();
hgs
parents:
diff changeset
    54
		
hgs
parents:
diff changeset
    55
		if (error != KErrNone && error != KErrAlreadyExists)
hgs
parents:
diff changeset
    56
			return error;
hgs
parents:
diff changeset
    57
		}
hgs
parents:
diff changeset
    58
	
hgs
parents:
diff changeset
    59
	return error;	
hgs
parents:
diff changeset
    60
    }
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
TInt RMemSpySession::StartServer()
hgs
parents:
diff changeset
    63
	{
hgs
parents:
diff changeset
    64
	RProcess server;
hgs
parents:
diff changeset
    65
	_LIT(KCommand, "start");
hgs
parents:
diff changeset
    66
	const TUid KServerUid3 = {0xE5883BC2};
hgs
parents:
diff changeset
    67
	TInt error = server.Create(KMemSpyServerName, KCommand);//, KServerUid3);
hgs
parents:
diff changeset
    68
	
hgs
parents:
diff changeset
    69
	if (error != KErrNone)
hgs
parents:
diff changeset
    70
		return error;
hgs
parents:
diff changeset
    71
	
hgs
parents:
diff changeset
    72
	TRequestStatus startStatus, stopStatus;
hgs
parents:
diff changeset
    73
	server.Logon(stopStatus);
hgs
parents:
diff changeset
    74
	if (stopStatus != KRequestPending)
hgs
parents:
diff changeset
    75
		{
hgs
parents:
diff changeset
    76
		User::WaitForRequest(stopStatus);
hgs
parents:
diff changeset
    77
		server.Kill(0);
hgs
parents:
diff changeset
    78
		server.Close();
hgs
parents:
diff changeset
    79
		return stopStatus.Int();
hgs
parents:
diff changeset
    80
		}
hgs
parents:
diff changeset
    81
	
hgs
parents:
diff changeset
    82
	server.Rendezvous(startStatus);
hgs
parents:
diff changeset
    83
	server.Resume();
hgs
parents:
diff changeset
    84
	User::WaitForRequest(startStatus, stopStatus);
hgs
parents:
diff changeset
    85
	if (startStatus == KRequestPending)
hgs
parents:
diff changeset
    86
		{
hgs
parents:
diff changeset
    87
		// not started yet, i.e. stopStatus was signaled
hgs
parents:
diff changeset
    88
		server.Close();
hgs
parents:
diff changeset
    89
		return stopStatus.Int();
hgs
parents:
diff changeset
    90
		}
hgs
parents:
diff changeset
    91
	
hgs
parents:
diff changeset
    92
	// Rendezvous was called - the server is ready
hgs
parents:
diff changeset
    93
	
hgs
parents:
diff changeset
    94
	// We first need to cancel Logon
hgs
parents:
diff changeset
    95
	server.LogonCancel(stopStatus);
hgs
parents:
diff changeset
    96
	// We don't need this anymore
hgs
parents:
diff changeset
    97
	server.Close();
hgs
parents:
diff changeset
    98
	// Wait for LogonCancel to complete
hgs
parents:
diff changeset
    99
	User::WaitForRequest(stopStatus);
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
	// Everything went OK
hgs
parents:
diff changeset
   102
	return KErrNone;
hgs
parents:
diff changeset
   103
	}
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
EXPORT_C void RMemSpySession::GetProcessesL(RArray<CMemSpyApiProcess*> &aProcesses, TSortType aSortType)
hgs
parents:
diff changeset
   106
	{
hgs
parents:
diff changeset
   107
	TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   108
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetProcessCount, TIpcArgs(&count)));
hgs
parents:
diff changeset
   109
	
hgs
parents:
diff changeset
   110
	TInt requestedCount = count();
hgs
parents:
diff changeset
   111
	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyProcessData));
hgs
parents:
diff changeset
   112
	TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   113
	
hgs
parents:
diff changeset
   114
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetProcesses, TIpcArgs(&count, &bufferPtr)));
hgs
parents:
diff changeset
   115
	aProcesses.Reset();
hgs
parents:
diff changeset
   116
	
hgs
parents:
diff changeset
   117
	TInt receivedCount = Min(count(), requestedCount);
hgs
parents:
diff changeset
   118
	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyProcessData))
hgs
parents:
diff changeset
   119
		{
hgs
parents:
diff changeset
   120
		TPckgBuf<TMemSpyProcessData> data;
hgs
parents:
diff changeset
   121
		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyProcessData));
hgs
parents:
diff changeset
   122
		aProcesses.AppendL(CMemSpyApiProcess::NewLC(data()));
hgs
parents:
diff changeset
   123
		}
hgs
parents:
diff changeset
   124
	CleanupStack::Pop(aProcesses.Count());
hgs
parents:
diff changeset
   125
	CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   126
	}
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
EXPORT_C TProcessId RMemSpySession::GetProcessIdByNameL(const TDesC& aProcessName)
hgs
parents:
diff changeset
   129
	{
hgs
parents:
diff changeset
   130
	TPckgBuf<TProcessId> procId;
hgs
parents:
diff changeset
   131
	User::LeaveIfError(SendReceive(EMemSpyClienServerOpGetProcessIdByName, 
hgs
parents:
diff changeset
   132
			TIpcArgs(&aProcessName, &procId)));
hgs
parents:
diff changeset
   133
	
hgs
parents:
diff changeset
   134
	return procId();
hgs
parents:
diff changeset
   135
	}
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
EXPORT_C TInt RMemSpySession::ProcessSystemPermanentOrCritical( TProcessId aId, TBool aValue )
hgs
parents:
diff changeset
   138
	{
hgs
parents:
diff changeset
   139
	TPckgBuf<TProcessId> arg1( aId );
hgs
parents:
diff changeset
   140
	TPckgBuf<TBool> arg2( aValue );
hgs
parents:
diff changeset
   141
	TIpcArgs args( &arg1, &arg2 );
hgs
parents:
diff changeset
   142
		
hgs
parents:
diff changeset
   143
	TInt error = SendReceive( EMemSpyClientServerOpProcessSystemPermanentOrCritical, args );
hgs
parents:
diff changeset
   144
	
hgs
parents:
diff changeset
   145
	aValue = arg2();
hgs
parents:
diff changeset
   146
	
hgs
parents:
diff changeset
   147
	return error;
hgs
parents:
diff changeset
   148
	}
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
EXPORT_C TInt RMemSpySession::EndProcessL( TProcessId aId, TMemSpyEndType aType )
hgs
parents:
diff changeset
   151
	{
hgs
parents:
diff changeset
   152
	TPckgBuf<TProcessId> arg1( aId );
hgs
parents:
diff changeset
   153
	TPckgBuf<TMemSpyEndType> arg2( aType );
hgs
parents:
diff changeset
   154
	TIpcArgs args( &arg1, &arg2 );
hgs
parents:
diff changeset
   155
	
hgs
parents:
diff changeset
   156
	TInt error = SendReceive( EMemSpyClientServerOpEndProcess, args );
hgs
parents:
diff changeset
   157
	
hgs
parents:
diff changeset
   158
	return error;
hgs
parents:
diff changeset
   159
	}
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
EXPORT_C TInt RMemSpySession::SwitchToProcess( TProcessId aId, TBool aBrought )
hgs
parents:
diff changeset
   162
	{
hgs
parents:
diff changeset
   163
	TPckgBuf<TProcessId> arg1( aId );
hgs
parents:
diff changeset
   164
	TPckgBuf<TBool> arg2( aBrought );
hgs
parents:
diff changeset
   165
	TIpcArgs args( &arg1, &arg2 );
hgs
parents:
diff changeset
   166
	
hgs
parents:
diff changeset
   167
	TInt error = SendReceive( EMemSpyClientServerOpSwitchToProcess, args );
hgs
parents:
diff changeset
   168
	
hgs
parents:
diff changeset
   169
	return error;	
hgs
parents:
diff changeset
   170
	}
hgs
parents:
diff changeset
   171
hgs
parents:
diff changeset
   172
// Threads related methods
hgs
parents:
diff changeset
   173
EXPORT_C void RMemSpySession::GetThreadsL(TProcessId aProcessId, RArray<CMemSpyApiThread*> &aThreads, TSortType aSortType)
hgs
parents:
diff changeset
   174
	{
hgs
parents:
diff changeset
   175
	TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   176
	TPckgBuf<TProcessId> pid(aProcessId);
hgs
parents:
diff changeset
   177
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetThreadCount, TIpcArgs(&count, &pid)));
hgs
parents:
diff changeset
   178
	
hgs
parents:
diff changeset
   179
	TInt requestedCount = count();
hgs
parents:
diff changeset
   180
	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyThreadData));
hgs
parents:
diff changeset
   181
	TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   182
	
hgs
parents:
diff changeset
   183
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetThreads, TIpcArgs(&count, &bufferPtr, &pid)));
hgs
parents:
diff changeset
   184
	aThreads.Reset();
hgs
parents:
diff changeset
   185
	
hgs
parents:
diff changeset
   186
	TInt receivedCount = Min(count(), requestedCount);
hgs
parents:
diff changeset
   187
	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyThreadData))
hgs
parents:
diff changeset
   188
		{
hgs
parents:
diff changeset
   189
		TPckgBuf<TMemSpyThreadData> data;
hgs
parents:
diff changeset
   190
		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyThreadData));
hgs
parents:
diff changeset
   191
		aThreads.AppendL(CMemSpyApiThread::NewLC(data()));
hgs
parents:
diff changeset
   192
		}
hgs
parents:
diff changeset
   193
	CleanupStack::Pop(aThreads.Count());
hgs
parents:
diff changeset
   194
	CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   195
	}
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
EXPORT_C void RMemSpySession::SetThreadPriorityL(TThreadId aId, TInt aPriority)
hgs
parents:
diff changeset
   198
	{
hgs
parents:
diff changeset
   199
	TPckgBuf<TThreadId> arg1( aId );
hgs
parents:
diff changeset
   200
	TPckgBuf<TInt> arg2( aPriority );
hgs
parents:
diff changeset
   201
	
hgs
parents:
diff changeset
   202
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpSetThreadPriority, TIpcArgs(&arg1, &arg2)));
hgs
parents:
diff changeset
   203
	}
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
EXPORT_C TInt RMemSpySession::ThreadSystemPermanentOrCritical( TThreadId aId, TBool aValue )
hgs
parents:
diff changeset
   206
	{
hgs
parents:
diff changeset
   207
	TPckgBuf<TThreadId> arg1( aId );
hgs
parents:
diff changeset
   208
	TPckgBuf<TBool> arg2( aValue );
hgs
parents:
diff changeset
   209
	TIpcArgs args( &arg1, &arg2 );
hgs
parents:
diff changeset
   210
	
hgs
parents:
diff changeset
   211
	TInt error = SendReceive( EMemSpyClientServerOpThreadSystemPermanentOrCritical, args );
hgs
parents:
diff changeset
   212
	
hgs
parents:
diff changeset
   213
	aValue = arg2();
hgs
parents:
diff changeset
   214
	
hgs
parents:
diff changeset
   215
	return error;
hgs
parents:
diff changeset
   216
	}
hgs
parents:
diff changeset
   217
hgs
parents:
diff changeset
   218
EXPORT_C TInt RMemSpySession::EndThreadL( TThreadId aId, TMemSpyEndType aType )
hgs
parents:
diff changeset
   219
	{
hgs
parents:
diff changeset
   220
	TPckgBuf<TThreadId> arg1( aId );
hgs
parents:
diff changeset
   221
	TPckgBuf<TMemSpyEndType> arg2( aType );
hgs
parents:
diff changeset
   222
	TIpcArgs args( &arg1, &arg2 );
hgs
parents:
diff changeset
   223
	
hgs
parents:
diff changeset
   224
	TInt error = SendReceive( EMemSpyClientServerOpEndThread, args );
hgs
parents:
diff changeset
   225
	
hgs
parents:
diff changeset
   226
	return error;
hgs
parents:
diff changeset
   227
	}
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
EXPORT_C TInt RMemSpySession::SwitchToThread( TThreadId aId, TBool aBrought )
hgs
parents:
diff changeset
   230
	{
hgs
parents:
diff changeset
   231
	TPckgBuf<TThreadId> arg1( aId );
hgs
parents:
diff changeset
   232
	TPckgBuf<TBool> arg2( aBrought );
hgs
parents:
diff changeset
   233
	TIpcArgs args( &arg1, &arg2 );
hgs
parents:
diff changeset
   234
	
hgs
parents:
diff changeset
   235
	TInt error = SendReceive( EMemSpyClientServerOpSwitchToThread, args );
hgs
parents:
diff changeset
   236
	
hgs
parents:
diff changeset
   237
	return error;	
hgs
parents:
diff changeset
   238
	}
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
EXPORT_C TInt RMemSpySession::GetInfoItemType( TInt aIndex, TThreadId aId, TMemSpyThreadInfoItemType &aType )
hgs
parents:
diff changeset
   241
	{
hgs
parents:
diff changeset
   242
	TPckgBuf<TInt> arg1( aIndex );
hgs
parents:
diff changeset
   243
	TPckgBuf<TThreadId> arg2( aId );
hgs
parents:
diff changeset
   244
	TPckgBuf<TMemSpyThreadInfoItemType> arg3;
hgs
parents:
diff changeset
   245
	TIpcArgs args( &arg1, &arg2, &arg3 );
hgs
parents:
diff changeset
   246
		
hgs
parents:
diff changeset
   247
	TInt error = SendReceive( EMemSpyClientServerOpGetInfoItemType, args );
hgs
parents:
diff changeset
   248
	
hgs
parents:
diff changeset
   249
	aType = arg3();
hgs
parents:
diff changeset
   250
	
hgs
parents:
diff changeset
   251
	return error;
hgs
parents:
diff changeset
   252
	}
hgs
parents:
diff changeset
   253
hgs
parents:
diff changeset
   254
EXPORT_C void RMemSpySession::GetThreadInfoItemsL( RArray<CMemSpyApiThreadInfoItem*> &aInfoItems, TThreadId aId, TMemSpyThreadInfoItemType aType )
hgs
parents:
diff changeset
   255
	{
hgs
parents:
diff changeset
   256
	TPckgBuf<TThreadId> id( aId );	
hgs
parents:
diff changeset
   257
	TPckgBuf<TMemSpyThreadInfoItemType> type( aType );
hgs
parents:
diff changeset
   258
	TPckgBuf<TInt> count;	
hgs
parents:
diff changeset
   259
	
hgs
parents:
diff changeset
   260
	TInt error = SendReceive( EMemSpyClientServerOpGetThreadInfoItemsCount, TIpcArgs( &id, &type, &count ) );
hgs
parents:
diff changeset
   261
	TInt itemCount = count();
hgs
parents:
diff changeset
   262
	
hgs
parents:
diff changeset
   263
	if( error == KErrNone )
hgs
parents:
diff changeset
   264
		{		
hgs
parents:
diff changeset
   265
		if( itemCount == 0 )
hgs
parents:
diff changeset
   266
			{
hgs
parents:
diff changeset
   267
			aInfoItems.Reset();
hgs
parents:
diff changeset
   268
			}
hgs
parents:
diff changeset
   269
		else
hgs
parents:
diff changeset
   270
			{
hgs
parents:
diff changeset
   271
			HBufC8* buffer = HBufC8::NewLC( itemCount * sizeof(TMemSpyThreadInfoItemData) );
hgs
parents:
diff changeset
   272
			TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   273
			
hgs
parents:
diff changeset
   274
			TPckgBuf<TInt> requestedCount( itemCount );
hgs
parents:
diff changeset
   275
			
hgs
parents:
diff changeset
   276
			TIpcArgs args( &requestedCount, &id, &type, &bufferPtr );
hgs
parents:
diff changeset
   277
			TInt error = SendReceive( EMemSpyClientServerOpGetThreadInfoItems, args ); // TODO check error
hgs
parents:
diff changeset
   278
			
hgs
parents:
diff changeset
   279
			aInfoItems.Reset();
hgs
parents:
diff changeset
   280
		
hgs
parents:
diff changeset
   281
			for(TInt i=0, offset = 0; i < itemCount; i++, offset+=sizeof(TMemSpyThreadInfoItemData))
hgs
parents:
diff changeset
   282
				{
hgs
parents:
diff changeset
   283
				TPckgBuf<TMemSpyThreadInfoItemData> data;
hgs
parents:
diff changeset
   284
				data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyThreadInfoItemData));
hgs
parents:
diff changeset
   285
				aInfoItems.AppendL(CMemSpyApiThreadInfoItem::NewLC(data()));
hgs
parents:
diff changeset
   286
				}
hgs
parents:
diff changeset
   287
			
hgs
parents:
diff changeset
   288
			CleanupStack::Pop(aInfoItems.Count());
hgs
parents:
diff changeset
   289
			CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   290
			}
hgs
parents:
diff changeset
   291
		}
hgs
parents:
diff changeset
   292
	
hgs
parents:
diff changeset
   293
	User::LeaveIfError(error);
hgs
parents:
diff changeset
   294
	}
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
EXPORT_C TInt RMemSpySession::GetThreadInfoItems( RArray<CMemSpyApiThreadInfoItem*> &aInfoItems, TThreadId aId, TMemSpyThreadInfoItemType aType )
hgs
parents:
diff changeset
   297
	{
hgs
parents:
diff changeset
   298
	TRAPD(error, GetThreadInfoItemsL(aInfoItems, aId, aType));
hgs
parents:
diff changeset
   299
	return error;
hgs
parents:
diff changeset
   300
	}
hgs
parents:
diff changeset
   301
hgs
parents:
diff changeset
   302
EXPORT_C void RMemSpySession::GetProcessIdByThreadId( TProcessId& aPID, TThreadId aTID )
hgs
parents:
diff changeset
   303
	{	
hgs
parents:
diff changeset
   304
	TPckgBuf<TProcessId> pid(aPID);
hgs
parents:
diff changeset
   305
	TPckgBuf<TThreadId> tid(aTID);
hgs
parents:
diff changeset
   306
	
hgs
parents:
diff changeset
   307
	TIpcArgs args( &pid, &tid );
hgs
parents:
diff changeset
   308
	User::LeaveIfError( SendReceive( EMemSpyClientServerOpGetProcessIdByThreadId, args ) );
hgs
parents:
diff changeset
   309
	aPID = pid();
hgs
parents:
diff changeset
   310
	}
hgs
parents:
diff changeset
   311
hgs
parents:
diff changeset
   312
//Kernel Objects specific operations
hgs
parents:
diff changeset
   313
EXPORT_C void RMemSpySession::GetKernelObjectsL( RArray<CMemSpyApiKernelObject*> &aKernelObjects )
hgs
parents:
diff changeset
   314
	{		
hgs
parents:
diff changeset
   315
	TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   316
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectCount, TIpcArgs(&count) ));
hgs
parents:
diff changeset
   317
	
hgs
parents:
diff changeset
   318
	TInt requestedCount = count();
hgs
parents:
diff changeset
   319
	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyKernelObjectData));
hgs
parents:
diff changeset
   320
	TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   321
		
hgs
parents:
diff changeset
   322
	TIpcArgs args( &count, &bufferPtr );
hgs
parents:
diff changeset
   323
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjects, args ));
hgs
parents:
diff changeset
   324
	
hgs
parents:
diff changeset
   325
	aKernelObjects.Reset();
hgs
parents:
diff changeset
   326
	
hgs
parents:
diff changeset
   327
	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyKernelObjectData))
hgs
parents:
diff changeset
   328
		{
hgs
parents:
diff changeset
   329
		TPckgBuf<TMemSpyKernelObjectData> data;
hgs
parents:
diff changeset
   330
		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyKernelObjectData));
hgs
parents:
diff changeset
   331
		aKernelObjects.AppendL(CMemSpyApiKernelObject::NewLC(data()));
hgs
parents:
diff changeset
   332
		}
hgs
parents:
diff changeset
   333
	
hgs
parents:
diff changeset
   334
	CleanupStack::Pop(aKernelObjects.Count());
hgs
parents:
diff changeset
   335
	CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   336
	}
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
EXPORT_C TInt RMemSpySession::GetKernelObjects( RArray<CMemSpyApiKernelObject*> &aKernelObjects )
hgs
parents:
diff changeset
   339
	{
hgs
parents:
diff changeset
   340
	TRAPD(error, GetKernelObjectsL(aKernelObjects));
hgs
parents:
diff changeset
   341
	return error;
hgs
parents:
diff changeset
   342
	}
hgs
parents:
diff changeset
   343
hgs
parents:
diff changeset
   344
EXPORT_C void RMemSpySession::GetKernelObjectItemsL( RArray<CMemSpyApiKernelObjectItem*> &aKernelObjectItems, TMemSpyDriverContainerType aForContainer )
hgs
parents:
diff changeset
   345
	{
hgs
parents:
diff changeset
   346
	TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   347
	TPckgBuf<TMemSpyDriverContainerType> type(aForContainer);
hgs
parents:
diff changeset
   348
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectItemCount, TIpcArgs(&count, &type) ));
hgs
parents:
diff changeset
   349
hgs
parents:
diff changeset
   350
	TInt requestedCount = count();
hgs
parents:
diff changeset
   351
	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyDriverHandleInfoGeneric));
hgs
parents:
diff changeset
   352
	TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   353
	
hgs
parents:
diff changeset
   354
	TIpcArgs args( &count, &type, &bufferPtr );
hgs
parents:
diff changeset
   355
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectItems, args ));
hgs
parents:
diff changeset
   356
	
hgs
parents:
diff changeset
   357
	aKernelObjectItems.Reset();
hgs
parents:
diff changeset
   358
	
hgs
parents:
diff changeset
   359
	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyDriverHandleInfoGeneric))
hgs
parents:
diff changeset
   360
		{
hgs
parents:
diff changeset
   361
		TPckgBuf<TMemSpyDriverHandleInfoGeneric> data;
hgs
parents:
diff changeset
   362
		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyDriverHandleInfoGeneric));
hgs
parents:
diff changeset
   363
		aKernelObjectItems.AppendL( CMemSpyApiKernelObjectItem::NewLC( data() ) );
hgs
parents:
diff changeset
   364
		}
hgs
parents:
diff changeset
   365
	CleanupStack::Pop(aKernelObjectItems.Count());
hgs
parents:
diff changeset
   366
	CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   367
	}
hgs
parents:
diff changeset
   368
hgs
parents:
diff changeset
   369
EXPORT_C TInt RMemSpySession::GetKernelObjectItems( RArray<CMemSpyApiKernelObjectItem*> &aKernelObjectItems, TMemSpyDriverContainerType aForContainer )
hgs
parents:
diff changeset
   370
	{
hgs
parents:
diff changeset
   371
	TRAPD(error, GetKernelObjectItemsL(aKernelObjectItems, aForContainer));
hgs
parents:
diff changeset
   372
	return error;
hgs
parents:
diff changeset
   373
	}
hgs
parents:
diff changeset
   374
hgs
parents:
diff changeset
   375
EXPORT_C void RMemSpySession::GetMemoryTrackingCyclesL(RArray<CMemSpyApiMemoryTrackingCycle*>& aCycles)
hgs
parents:
diff changeset
   376
	{
hgs
parents:
diff changeset
   377
	TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   378
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetMemoryTrackingCycleCount, TIpcArgs(&count) ));
hgs
parents:
diff changeset
   379
	
hgs
parents:
diff changeset
   380
	TInt requestedCount = count();
hgs
parents:
diff changeset
   381
	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyMemoryTrackingCycleData));
hgs
parents:
diff changeset
   382
	TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   383
		
hgs
parents:
diff changeset
   384
	TIpcArgs args( &count, &bufferPtr );
hgs
parents:
diff changeset
   385
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetMemoryTrackingCycles, args ));
hgs
parents:
diff changeset
   386
	
hgs
parents:
diff changeset
   387
	aCycles.Reset();
hgs
parents:
diff changeset
   388
	
hgs
parents:
diff changeset
   389
	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyMemoryTrackingCycleData))
hgs
parents:
diff changeset
   390
		{
hgs
parents:
diff changeset
   391
		TPckgBuf<TMemSpyMemoryTrackingCycleData> data;
hgs
parents:
diff changeset
   392
		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyMemoryTrackingCycleData));
hgs
parents:
diff changeset
   393
		aCycles.AppendL(CMemSpyApiMemoryTrackingCycle::NewLC(data()));
hgs
parents:
diff changeset
   394
		}
hgs
parents:
diff changeset
   395
	
hgs
parents:
diff changeset
   396
	CleanupStack::Pop(aCycles.Count());
hgs
parents:
diff changeset
   397
	CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   398
	}
hgs
parents:
diff changeset
   399
hgs
parents:
diff changeset
   400
EXPORT_C void RMemSpySession::OutputAllContainerContents()
hgs
parents:
diff changeset
   401
	{
hgs
parents:
diff changeset
   402
	SendReceive( EMemSpyClientServerOpOutputAllContainerContents );
hgs
parents:
diff changeset
   403
	}
hgs
parents:
diff changeset
   404
hgs
parents:
diff changeset
   405
hgs
parents:
diff changeset
   406
//Heap specific operations
hgs
parents:
diff changeset
   407
hgs
parents:
diff changeset
   408
EXPORT_C CMemSpyApiHeap* RMemSpySession::GetHeapL()
hgs
parents:
diff changeset
   409
	{
hgs
parents:
diff changeset
   410
	CMemSpyApiHeap* aHeap;
hgs
parents:
diff changeset
   411
	
hgs
parents:
diff changeset
   412
	HBufC8* buffer = HBufC8::NewLC( sizeof(TMemSpyHeapData) );
hgs
parents:
diff changeset
   413
	TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   414
	TIpcArgs args( &bufferPtr );
hgs
parents:
diff changeset
   415
	
hgs
parents:
diff changeset
   416
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetHeap, args ));
hgs
parents:
diff changeset
   417
	
hgs
parents:
diff changeset
   418
	TPckgBuf<TMemSpyHeapData> data;
hgs
parents:
diff changeset
   419
	data.Copy(bufferPtr.Ptr(), sizeof(TMemSpyHeapData));		
hgs
parents:
diff changeset
   420
	aHeap = CMemSpyApiHeap::NewL( data() );
hgs
parents:
diff changeset
   421
	
hgs
parents:
diff changeset
   422
	CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   423
		
hgs
parents:
diff changeset
   424
	return aHeap;
hgs
parents:
diff changeset
   425
	}
hgs
parents:
diff changeset
   426
hgs
parents:
diff changeset
   427
EXPORT_C CMemSpyApiHeap* RMemSpySession::GetHeap()
hgs
parents:
diff changeset
   428
	{
hgs
parents:
diff changeset
   429
	CMemSpyApiHeap *result = NULL;
hgs
parents:
diff changeset
   430
	TRAPD(error, result = GetHeapL());
hgs
parents:
diff changeset
   431
	return error == KErrNone ? result : NULL;
hgs
parents:
diff changeset
   432
	}
hgs
parents:
diff changeset
   433
hgs
parents:
diff changeset
   434
hgs
parents:
diff changeset
   435
hgs
parents:
diff changeset
   436
EXPORT_C void RMemSpySession::GetEComCategoriesL(RArray<CMemSpyApiEComCategory*> &aCategories)
hgs
parents:
diff changeset
   437
    {
hgs
parents:
diff changeset
   438
    TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   439
    User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComCategoryCount, TIpcArgs(&count)));
hgs
parents:
diff changeset
   440
    
hgs
parents:
diff changeset
   441
    TInt requestedCount = count();
hgs
parents:
diff changeset
   442
    HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyEComCategoryData));
hgs
parents:
diff changeset
   443
    TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   444
    
hgs
parents:
diff changeset
   445
    User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComCategories, TIpcArgs(&count, &bufferPtr)));
hgs
parents:
diff changeset
   446
    aCategories.Reset();
hgs
parents:
diff changeset
   447
    
hgs
parents:
diff changeset
   448
    TInt receivedCount = Min(count(), requestedCount);
hgs
parents:
diff changeset
   449
    for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyEComCategoryData))
hgs
parents:
diff changeset
   450
        {
hgs
parents:
diff changeset
   451
        TPckgBuf<TMemSpyEComCategoryData> data;
hgs
parents:
diff changeset
   452
        data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyEComCategoryData));
hgs
parents:
diff changeset
   453
        aCategories.AppendL(CMemSpyApiEComCategory::NewLC(data()));
hgs
parents:
diff changeset
   454
        }
hgs
parents:
diff changeset
   455
    CleanupStack::Pop(aCategories.Count());
hgs
parents:
diff changeset
   456
    CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   457
    }
hgs
parents:
diff changeset
   458
    
hgs
parents:
diff changeset
   459
EXPORT_C void RMemSpySession::GetEComInterfacesL(TUid aCategory, RArray<CMemSpyApiEComInterface*> &aInterfaces)
hgs
parents:
diff changeset
   460
    {
hgs
parents:
diff changeset
   461
    TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   462
    TPckgBuf<TUid> category(aCategory);
hgs
parents:
diff changeset
   463
    User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComInterfaceCount, TIpcArgs(&count, &category)));
hgs
parents:
diff changeset
   464
    
hgs
parents:
diff changeset
   465
    TInt requestedCount = count();
hgs
parents:
diff changeset
   466
    HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyEComInterfaceData));
hgs
parents:
diff changeset
   467
    TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   468
    
hgs
parents:
diff changeset
   469
    User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComInterfaces, TIpcArgs(&count, &category, &bufferPtr)));
hgs
parents:
diff changeset
   470
    aInterfaces.Reset();
hgs
parents:
diff changeset
   471
    
hgs
parents:
diff changeset
   472
    TInt receivedCount = Min(count(), requestedCount);
hgs
parents:
diff changeset
   473
    for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyEComInterfaceData))
hgs
parents:
diff changeset
   474
        {
hgs
parents:
diff changeset
   475
        TPckgBuf<TMemSpyEComInterfaceData> data;
hgs
parents:
diff changeset
   476
        data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyEComInterfaceData));
hgs
parents:
diff changeset
   477
        aInterfaces.AppendL(CMemSpyApiEComInterface::NewLC(data()));
hgs
parents:
diff changeset
   478
        }
hgs
parents:
diff changeset
   479
    CleanupStack::Pop(aInterfaces.Count());
hgs
parents:
diff changeset
   480
    CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   481
    }
hgs
parents:
diff changeset
   482
hgs
parents:
diff changeset
   483
EXPORT_C void RMemSpySession::GetEComImplementationsL(TUid aInterface, RArray<CMemSpyApiEComImplementation*> &aImplementations)
hgs
parents:
diff changeset
   484
    {
hgs
parents:
diff changeset
   485
    TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   486
    TPckgBuf<TUid> interface(aInterface);
hgs
parents:
diff changeset
   487
    User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComImplementationCount, TIpcArgs(&count, &interface)));
hgs
parents:
diff changeset
   488
    
hgs
parents:
diff changeset
   489
    TInt requestedCount = count();
hgs
parents:
diff changeset
   490
    HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyEComImplementationData));
hgs
parents:
diff changeset
   491
    TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   492
    
hgs
parents:
diff changeset
   493
    User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComImplementations, TIpcArgs(&count, &interface, &bufferPtr)));
hgs
parents:
diff changeset
   494
    aImplementations.Reset();
hgs
parents:
diff changeset
   495
    
hgs
parents:
diff changeset
   496
    TInt receivedCount = Min(count(), requestedCount);
hgs
parents:
diff changeset
   497
    for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyEComImplementationData))
hgs
parents:
diff changeset
   498
        {
hgs
parents:
diff changeset
   499
        TPckgBuf<TMemSpyEComImplementationData> data;
hgs
parents:
diff changeset
   500
        data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyEComImplementationData));
hgs
parents:
diff changeset
   501
        aImplementations.AppendL(CMemSpyApiEComImplementation::NewLC(data()));
hgs
parents:
diff changeset
   502
        }
hgs
parents:
diff changeset
   503
    CleanupStack::Pop(aImplementations.Count());
hgs
parents:
diff changeset
   504
    CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   505
    }
hgs
parents:
diff changeset
   506
hgs
parents:
diff changeset
   507
EXPORT_C void RMemSpySession::DumpKernelHeap()
hgs
parents:
diff changeset
   508
	{
hgs
parents:
diff changeset
   509
	SendReceive( EMemSpyClientServerOpDumpKernelHeap );
hgs
parents:
diff changeset
   510
	}
hgs
parents:
diff changeset
   511
hgs
parents:
diff changeset
   512
EXPORT_C void RMemSpySession::OutputKernelHeapDataL()
hgs
parents:
diff changeset
   513
	{		
hgs
parents:
diff changeset
   514
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpHeapData | KMemSpyOpFlagsIncludesThreadId,
hgs
parents:
diff changeset
   515
			TIpcArgs(KMemSpyClientServerThreadIdKernel)));
hgs
parents:
diff changeset
   516
	
hgs
parents:
diff changeset
   517
	}
hgs
parents:
diff changeset
   518
hgs
parents:
diff changeset
   519
EXPORT_C void RMemSpySession::OutputKernelHeapData(TRequestStatus& aStatus)
hgs
parents:
diff changeset
   520
	{
hgs
parents:
diff changeset
   521
	SendReceive(EMemSpyClientServerOpHeapData,
hgs
parents:
diff changeset
   522
		TIpcArgs(KMemSpyClientServerThreadIdKernel),
hgs
parents:
diff changeset
   523
		aStatus);
hgs
parents:
diff changeset
   524
	}
hgs
parents:
diff changeset
   525
hgs
parents:
diff changeset
   526
EXPORT_C void RMemSpySession::OutputThreadHeapDataL( TThreadId aThreadId)
hgs
parents:
diff changeset
   527
	{			
hgs
parents:
diff changeset
   528
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpHeapData | KMemSpyOpFlagsIncludesThreadId,
hgs
parents:
diff changeset
   529
			TIpcArgs(aThreadId)));
hgs
parents:
diff changeset
   530
	}
hgs
parents:
diff changeset
   531
hgs
parents:
diff changeset
   532
EXPORT_C void RMemSpySession::OutputThreadHeapDataL(const TDesC& aThreadName)
hgs
parents:
diff changeset
   533
	{	
hgs
parents:
diff changeset
   534
	const TIpcArgs args( &aThreadName );
hgs
parents:
diff changeset
   535
	        
hgs
parents:
diff changeset
   536
	User::LeaveIfError( SendReceive( EMemSpyClientServerOpHeapData | KMemSpyOpFlagsIncludesThreadName, args ));	
hgs
parents:
diff changeset
   537
	}
hgs
parents:
diff changeset
   538
hgs
parents:
diff changeset
   539
EXPORT_C void RMemSpySession::OutputThreadCellListL(TThreadId aThreadId)
hgs
parents:
diff changeset
   540
	{	
hgs
parents:
diff changeset
   541
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpHeapCellListing | KMemSpyOpFlagsIncludesThreadId,
hgs
parents:
diff changeset
   542
			TIpcArgs(aThreadId)));
hgs
parents:
diff changeset
   543
	}
hgs
parents:
diff changeset
   544
hgs
parents:
diff changeset
   545
EXPORT_C void RMemSpySession::OutputHeapInfoUserL(TThreadId aThreadId)
hgs
parents:
diff changeset
   546
	{
hgs
parents:
diff changeset
   547
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpHeapInfo | KMemSpyOpFlagsIncludesThreadId,
hgs
parents:
diff changeset
   548
			TIpcArgs(aThreadId)));
hgs
parents:
diff changeset
   549
	}
hgs
parents:
diff changeset
   550
hgs
parents:
diff changeset
   551
EXPORT_C void RMemSpySession::SwitchOutputSinkL( TMemSpySinkType aType )
hgs
parents:
diff changeset
   552
	{
hgs
parents:
diff changeset
   553
	TInt op;
hgs
parents:
diff changeset
   554
	if( aType == ESinkTypeFile )
hgs
parents:
diff changeset
   555
		op = EMemSpyClientServerOpSwitchOutputSinkFile;
hgs
parents:
diff changeset
   556
	else
hgs
parents:
diff changeset
   557
		op = EMemSpyClientServerOpSwitchOutputSinkTrace;
hgs
parents:
diff changeset
   558
			
hgs
parents:
diff changeset
   559
	User::LeaveIfError(SendReceive( op ));
hgs
parents:
diff changeset
   560
	}
hgs
parents:
diff changeset
   561
hgs
parents:
diff changeset
   562
EXPORT_C void RMemSpySession::SwitchOutputToTraceL()
hgs
parents:
diff changeset
   563
	{
hgs
parents:
diff changeset
   564
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSwitchOutputSinkTrace));
hgs
parents:
diff changeset
   565
	}
hgs
parents:
diff changeset
   566
    
hgs
parents:
diff changeset
   567
EXPORT_C void RMemSpySession::SwitchOutputToFileL(const TDesC& aRootFolder)
hgs
parents:
diff changeset
   568
	{
hgs
parents:
diff changeset
   569
	TIpcArgs args;
hgs
parents:
diff changeset
   570
	if (aRootFolder.Length())
hgs
parents:
diff changeset
   571
		{
hgs
parents:
diff changeset
   572
		args.Set(0, &aRootFolder);
hgs
parents:
diff changeset
   573
		}
hgs
parents:
diff changeset
   574
	
hgs
parents:
diff changeset
   575
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSwitchOutputSinkFile, args));
hgs
parents:
diff changeset
   576
	}
hgs
parents:
diff changeset
   577
hgs
parents:
diff changeset
   578
EXPORT_C void RMemSpySession::OutputStackInfoL(TThreadId aThreadId)
hgs
parents:
diff changeset
   579
	{
hgs
parents:
diff changeset
   580
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpStackInfo | KMemSpyOpFlagsIncludesThreadId,
hgs
parents:
diff changeset
   581
			TIpcArgs(aThreadId)));
hgs
parents:
diff changeset
   582
	}
hgs
parents:
diff changeset
   583
hgs
parents:
diff changeset
   584
EXPORT_C void RMemSpySession::OutputStackDataL(TThreadId aThreadId, TMemSpyDriverDomainType aType )
hgs
parents:
diff changeset
   585
	{
hgs
parents:
diff changeset
   586
	TInt op;
hgs
parents:
diff changeset
   587
	if( aType == EMemSpyDriverDomainUser )
hgs
parents:
diff changeset
   588
		op = EMemSpyClientServerOpStackDataUser;
hgs
parents:
diff changeset
   589
	else
hgs
parents:
diff changeset
   590
		op = EMemSpyClientServerOpStackDataKernel;
hgs
parents:
diff changeset
   591
	
hgs
parents:
diff changeset
   592
	User::LeaveIfError(SendReceive( op | KMemSpyOpFlagsIncludesThreadId,
hgs
parents:
diff changeset
   593
			TIpcArgs(aThreadId, aType)));
hgs
parents:
diff changeset
   594
		
hgs
parents:
diff changeset
   595
	}
hgs
parents:
diff changeset
   596
hgs
parents:
diff changeset
   597
EXPORT_C void RMemSpySession::OutputThreadInfoHandlesL(TThreadId aThreadId)
hgs
parents:
diff changeset
   598
	{
hgs
parents:
diff changeset
   599
	TPckgBuf<TThreadId> id(aThreadId);
hgs
parents:
diff changeset
   600
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpOutputInfoHandles, TIpcArgs( &id )));	
hgs
parents:
diff changeset
   601
	}
hgs
parents:
diff changeset
   602
hgs
parents:
diff changeset
   603
EXPORT_C void RMemSpySession::OutputAOListL(TThreadId aId, TMemSpyThreadInfoItemType aType)
hgs
parents:
diff changeset
   604
	{
hgs
parents:
diff changeset
   605
	TPckgBuf<TThreadId> id(aId);
hgs
parents:
diff changeset
   606
	TPckgBuf<TMemSpyThreadInfoItemType> type(aType);
hgs
parents:
diff changeset
   607
	
hgs
parents:
diff changeset
   608
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpOutputAOList, TIpcArgs( &id, &type )));
hgs
parents:
diff changeset
   609
	}
hgs
parents:
diff changeset
   610
hgs
parents:
diff changeset
   611
EXPORT_C void RMemSpySession::OutputKernelObjectsL()
hgs
parents:
diff changeset
   612
	{
hgs
parents:
diff changeset
   613
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpEnumerateKernelContainerAll));
hgs
parents:
diff changeset
   614
	}
hgs
parents:
diff changeset
   615
hgs
parents:
diff changeset
   616
EXPORT_C void RMemSpySession::OutputCompactStackInfoL()
hgs
parents:
diff changeset
   617
	{
hgs
parents:
diff changeset
   618
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpStackInfoCompact)); 
hgs
parents:
diff changeset
   619
	}
hgs
parents:
diff changeset
   620
hgs
parents:
diff changeset
   621
EXPORT_C void RMemSpySession::OutputCompactHeapInfoL()
hgs
parents:
diff changeset
   622
	{
hgs
parents:
diff changeset
   623
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpHeapInfoCompact)); 
hgs
parents:
diff changeset
   624
	}
hgs
parents:
diff changeset
   625
// Asynchronous operations
hgs
parents:
diff changeset
   626
EXPORT_C void RMemSpySession::OutputPhoneInfo(TRequestStatus& aStatus)
hgs
parents:
diff changeset
   627
	{	
hgs
parents:
diff changeset
   628
	SendReceive(EMemSpyClientServerOpSummaryInfo | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents:
diff changeset
   629
	}
hgs
parents:
diff changeset
   630
hgs
parents:
diff changeset
   631
EXPORT_C void RMemSpySession::OutputDetailedPhoneInfo(TRequestStatus& aStatus)
hgs
parents:
diff changeset
   632
	{	
hgs
parents:
diff changeset
   633
	SendReceive(EMemSpyClientServerOpSummaryInfoDetailed | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents:
diff changeset
   634
	}
hgs
parents:
diff changeset
   635
hgs
parents:
diff changeset
   636
EXPORT_C void RMemSpySession::OutputHeapInfo(TRequestStatus& aStatus)
hgs
parents:
diff changeset
   637
	{	
hgs
parents:
diff changeset
   638
	SendReceive(EMemSpyClientServerOpHeapInfo | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents:
diff changeset
   639
	}
hgs
parents:
diff changeset
   640
hgs
parents:
diff changeset
   641
EXPORT_C void RMemSpySession::OutputCompactHeapInfo(TRequestStatus& aStatus)
hgs
parents:
diff changeset
   642
	{	
hgs
parents:
diff changeset
   643
	SendReceive(EMemSpyClientServerOpHeapInfoCompact | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents:
diff changeset
   644
	}
hgs
parents:
diff changeset
   645
hgs
parents:
diff changeset
   646
EXPORT_C void RMemSpySession::OutputHeapCellListing(TRequestStatus& aStatus)
hgs
parents:
diff changeset
   647
	{	
hgs
parents:
diff changeset
   648
	SendReceive(EMemSpyClientServerOpHeapCellListing | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents:
diff changeset
   649
	}
hgs
parents:
diff changeset
   650
hgs
parents:
diff changeset
   651
EXPORT_C void RMemSpySession::OutputHeapData(TRequestStatus& aStatus)
hgs
parents:
diff changeset
   652
	{	
hgs
parents:
diff changeset
   653
	SendReceive(EMemSpyClientServerOpHeapData | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents:
diff changeset
   654
	}
hgs
parents:
diff changeset
   655
hgs
parents:
diff changeset
   656
// synchronous version of the operation - for CLI
hgs
parents:
diff changeset
   657
EXPORT_C void RMemSpySession::OutputHeapData()
hgs
parents:
diff changeset
   658
	{
hgs
parents:
diff changeset
   659
	SendReceive(EMemSpyClientServerOpHeapData);
hgs
parents:
diff changeset
   660
	}
hgs
parents:
diff changeset
   661
hgs
parents:
diff changeset
   662
EXPORT_C void RMemSpySession::OutputStackInfo(TRequestStatus& aStatus)
hgs
parents:
diff changeset
   663
	{	
hgs
parents:
diff changeset
   664
	SendReceive(EMemSpyClientServerOpStackInfo | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents:
diff changeset
   665
	}
hgs
parents:
diff changeset
   666
hgs
parents:
diff changeset
   667
EXPORT_C void RMemSpySession::OutputCompactStackInfo(TRequestStatus& aStatus)
hgs
parents:
diff changeset
   668
	{	
hgs
parents:
diff changeset
   669
	SendReceive(EMemSpyClientServerOpStackInfoCompact | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents:
diff changeset
   670
	}
hgs
parents:
diff changeset
   671
hgs
parents:
diff changeset
   672
EXPORT_C void RMemSpySession::OutputUserStackData(TRequestStatus& aStatus)
hgs
parents:
diff changeset
   673
	{	
hgs
parents:
diff changeset
   674
	SendReceive(EMemSpyClientServerOpStackDataUser | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents:
diff changeset
   675
	}
hgs
parents:
diff changeset
   676
hgs
parents:
diff changeset
   677
EXPORT_C void RMemSpySession::OutputKernelStackData(TRequestStatus& aStatus)
hgs
parents:
diff changeset
   678
	{	
hgs
parents:
diff changeset
   679
	SendReceive(EMemSpyClientServerOpStackDataKernel | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents:
diff changeset
   680
	}
hgs
parents:
diff changeset
   681
hgs
parents:
diff changeset
   682
// Synchronous operations
hgs
parents:
diff changeset
   683
EXPORT_C void RMemSpySession::OutputPhoneInfo()
hgs
parents:
diff changeset
   684
	{	
hgs
parents:
diff changeset
   685
	SendReceive( EMemSpyClientServerOpSummaryInfo , TIpcArgs() );
hgs
parents:
diff changeset
   686
	}
hgs
parents:
diff changeset
   687
hgs
parents:
diff changeset
   688
EXPORT_C TInt RMemSpySession::GetSwmtCyclesCount()
hgs
parents:
diff changeset
   689
	{
hgs
parents:
diff changeset
   690
	TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   691
	TIpcArgs args( &count );
hgs
parents:
diff changeset
   692
		
hgs
parents:
diff changeset
   693
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetMemoryTrackingCycleCount, args ));
hgs
parents:
diff changeset
   694
	
hgs
parents:
diff changeset
   695
	return count();
hgs
parents:
diff changeset
   696
	}
hgs
parents:
diff changeset
   697
hgs
parents:
diff changeset
   698
EXPORT_C void RMemSpySession::SetSwmtAutoStartProcessList( CArrayFixFlat<TUid>* aList )
hgs
parents:
diff changeset
   699
	{
hgs
parents:
diff changeset
   700
	TInt count = aList->Count();
hgs
parents:
diff changeset
   701
	TIpcArgs args( &aList, &count );
hgs
parents:
diff changeset
   702
	
hgs
parents:
diff changeset
   703
	SendReceive( EMemSpyClientServerOpSetSwmtAutoStartProcessList, args );
hgs
parents:
diff changeset
   704
	}
hgs
parents:
diff changeset
   705
hgs
parents:
diff changeset
   706
EXPORT_C void RMemSpySession::SwmtResetTracking()
hgs
parents:
diff changeset
   707
	{
hgs
parents:
diff changeset
   708
	SendReceive( EMemSpyClientServerOpSystemWideMemoryTrackingReset );
hgs
parents:
diff changeset
   709
	}
hgs
parents:
diff changeset
   710
hgs
parents:
diff changeset
   711
EXPORT_C void RMemSpySession::GetOutputSink( TMemSpySinkType& aType )
hgs
parents:
diff changeset
   712
	{
hgs
parents:
diff changeset
   713
	TPckgBuf<TMemSpySinkType> type( aType );
hgs
parents:
diff changeset
   714
	TIpcArgs args( &type );
hgs
parents:
diff changeset
   715
	
hgs
parents:
diff changeset
   716
	SendReceive( EMemSpyClientServerOpGetOutputSink, args );
hgs
parents:
diff changeset
   717
	
hgs
parents:
diff changeset
   718
	aType = type();
hgs
parents:
diff changeset
   719
	}
hgs
parents:
diff changeset
   720
hgs
parents:
diff changeset
   721
EXPORT_C void RMemSpySession::NotifyDeviceWideOperationProgress(TMemSpyDeviceWideOperationProgress &aProgress, TRequestStatus &aStatus)
hgs
parents:
diff changeset
   722
	{
hgs
parents:
diff changeset
   723
	SendReceive(EMemSpyClientServerOpNotifyDeviceWideOperationProgress | KMemSpyOpFlagsAsyncOperation,
hgs
parents:
diff changeset
   724
			TIpcArgs(&aProgress.iProgress, &aProgress.iDescription), 
hgs
parents:
diff changeset
   725
			aStatus);
hgs
parents:
diff changeset
   726
	}
hgs
parents:
diff changeset
   727
hgs
parents:
diff changeset
   728
EXPORT_C void RMemSpySession::CancelDeviceWideOperationL()
hgs
parents:
diff changeset
   729
	{
hgs
parents:
diff changeset
   730
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpCancelDeviceWideOperation));
hgs
parents:
diff changeset
   731
	}
hgs
parents:
diff changeset
   732
hgs
parents:
diff changeset
   733
// SWMT operations
hgs
parents:
diff changeset
   734
EXPORT_C void RMemSpySession::SetSwmtCategoriesL(TInt aCategories)
hgs
parents:
diff changeset
   735
	{
hgs
parents:
diff changeset
   736
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingCategoriesSet,
hgs
parents:
diff changeset
   737
			TIpcArgs(aCategories)));
hgs
parents:
diff changeset
   738
	}
hgs
parents:
diff changeset
   739
hgs
parents:
diff changeset
   740
EXPORT_C void RMemSpySession::SetSwmtHeapDumpsEnabledL(TBool aEnabled)
hgs
parents:
diff changeset
   741
	{
hgs
parents:
diff changeset
   742
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingHeapDumpSet,
hgs
parents:
diff changeset
   743
			TIpcArgs(aEnabled)));
hgs
parents:
diff changeset
   744
	}
hgs
parents:
diff changeset
   745
hgs
parents:
diff changeset
   746
EXPORT_C void RMemSpySession::SetSwmtMode(TMemSpyEngineHelperSysMemTrackerConfig::TMemSpyEngineSysMemTrackerMode aMode)
hgs
parents:
diff changeset
   747
	{
hgs
parents:
diff changeset
   748
	TPckgBuf<TMemSpyEngineHelperSysMemTrackerConfig::TMemSpyEngineSysMemTrackerMode> mode( aMode );
hgs
parents:
diff changeset
   749
	TIpcArgs args(&mode);
hgs
parents:
diff changeset
   750
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingModeSet, args));
hgs
parents:
diff changeset
   751
	}
hgs
parents:
diff changeset
   752
hgs
parents:
diff changeset
   753
EXPORT_C TBool RMemSpySession::IsSwmtRunningL()
hgs
parents:
diff changeset
   754
	{
hgs
parents:
diff changeset
   755
	TPckgBuf<TBool> ret;
hgs
parents:
diff changeset
   756
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpIsSwmtRunning, TIpcArgs(&ret)));
hgs
parents:
diff changeset
   757
	
hgs
parents:
diff changeset
   758
	return ret();
hgs
parents:
diff changeset
   759
	}
hgs
parents:
diff changeset
   760
hgs
parents:
diff changeset
   761
EXPORT_C void RMemSpySession::StartSwmtTimerL(TInt aPeriod)
hgs
parents:
diff changeset
   762
	{
hgs
parents:
diff changeset
   763
	SetSwmtTimerIntervalL(aPeriod);
hgs
parents:
diff changeset
   764
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerStart));
hgs
parents:
diff changeset
   765
	}
hgs
parents:
diff changeset
   766
hgs
parents:
diff changeset
   767
EXPORT_C void RMemSpySession::StartSwmtTimerL()
hgs
parents:
diff changeset
   768
	{
hgs
parents:
diff changeset
   769
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerStart));
hgs
parents:
diff changeset
   770
	}
hgs
parents:
diff changeset
   771
hgs
parents:
diff changeset
   772
EXPORT_C void RMemSpySession::SetSwmtTimerIntervalL(TInt aPeriod)
hgs
parents:
diff changeset
   773
	{
hgs
parents:
diff changeset
   774
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerPeriodSet,
hgs
parents:
diff changeset
   775
			TIpcArgs(aPeriod)));
hgs
parents:
diff changeset
   776
	}
hgs
parents:
diff changeset
   777
hgs
parents:
diff changeset
   778
EXPORT_C void RMemSpySession::StopSwmtTimerL()
hgs
parents:
diff changeset
   779
	{
hgs
parents:
diff changeset
   780
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerStop));
hgs
parents:
diff changeset
   781
	}
hgs
parents:
diff changeset
   782
hgs
parents:
diff changeset
   783
hgs
parents:
diff changeset
   784
EXPORT_C void RMemSpySession::ForceSwmtUpdateL()
hgs
parents:
diff changeset
   785
	{
hgs
parents:
diff changeset
   786
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingForceUpdate));
hgs
parents:
diff changeset
   787
	}
hgs
parents:
diff changeset
   788
hgs
parents:
diff changeset
   789
EXPORT_C void RMemSpySession::ForceSwmtUpdate(TRequestStatus& aStatus)
hgs
parents:
diff changeset
   790
	{
hgs
parents:
diff changeset
   791
	SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingForceUpdate, 
hgs
parents:
diff changeset
   792
			TIpcArgs(),
hgs
parents:
diff changeset
   793
			aStatus);
hgs
parents:
diff changeset
   794
	}
hgs
parents:
diff changeset
   795
hgs
parents:
diff changeset
   796
EXPORT_C void RMemSpySession::SetSwmtFilter( const TDesC& aFilter )
hgs
parents:
diff changeset
   797
	{	
hgs
parents:
diff changeset
   798
	TIpcArgs args( &aFilter );
hgs
parents:
diff changeset
   799
	User::LeaveIfError( SendReceive( EMemSpyClientServerOpSystemWideMemoryTrackingThreadNameFilterSet, args ) );
hgs
parents:
diff changeset
   800
	}
hgs
parents:
diff changeset
   801
hgs
parents:
diff changeset
   802
EXPORT_C void RMemSpySession::GetSwmtFilter( TName& aFilter )
hgs
parents:
diff changeset
   803
	{
hgs
parents:
diff changeset
   804
    TPckgBuf<TName> name;
hgs
parents:
diff changeset
   805
    TIpcArgs args( &name );
hgs
parents:
diff changeset
   806
		User::LeaveIfError( SendReceive( EMemSpyClientServerOpSystemWideMemoryTrackingThreadNameFilterGet, args ) );
hgs
parents:
diff changeset
   807
	aFilter = name();
hgs
parents:
diff changeset
   808
	}
hgs
parents:
diff changeset
   809
        
hgs
parents:
diff changeset
   810
EXPORT_C void RMemSpySession::GetSwmtCategoriesL(TInt& aCategories)
hgs
parents:
diff changeset
   811
	{
hgs
parents:
diff changeset
   812
	TPckgBuf<TInt> cat;	
hgs
parents:
diff changeset
   813
	TIpcArgs args( &cat );
hgs
parents:
diff changeset
   814
		User::LeaveIfError( SendReceive( EMemSpyClientServerOpSystemWideMemoryTrackingCategoriesGet, args ) );
hgs
parents:
diff changeset
   815
	aCategories = cat();
hgs
parents:
diff changeset
   816
	}
hgs
parents:
diff changeset
   817
hgs
parents:
diff changeset
   818
EXPORT_C void RMemSpySession::GetSwmtHeapDumpsEnabledL(TBool& aEnabled)
hgs
parents:
diff changeset
   819
	{
hgs
parents:
diff changeset
   820
	TPckgBuf<TBool> enabled;
hgs
parents:
diff changeset
   821
	TIpcArgs args( &enabled );
hgs
parents:
diff changeset
   822
		User::LeaveIfError( SendReceive( EMemSpyClientServerOpSystemWideMemoryTrackingHeapDumpGet, args ) );
hgs
parents:
diff changeset
   823
		
hgs
parents:
diff changeset
   824
	aEnabled = enabled();
hgs
parents:
diff changeset
   825
	}
hgs
parents:
diff changeset
   826
        
hgs
parents:
diff changeset
   827
EXPORT_C void RMemSpySession::GetSwmtMode(TMemSpyEngineHelperSysMemTrackerConfig::TMemSpyEngineSysMemTrackerMode& aMode)
hgs
parents:
diff changeset
   828
	{
hgs
parents:
diff changeset
   829
	TPckgBuf<TMemSpyEngineHelperSysMemTrackerConfig::TMemSpyEngineSysMemTrackerMode> mode;
hgs
parents:
diff changeset
   830
	TIpcArgs args( &mode );
hgs
parents:
diff changeset
   831
		User::LeaveIfError( SendReceive( EMemSpyClientServerOpSystemWideMemoryTrackingModeGet, args ) );
hgs
parents:
diff changeset
   832
	aMode = mode();
hgs
parents:
diff changeset
   833
	}
hgs
parents:
diff changeset
   834
    
hgs
parents:
diff changeset
   835
EXPORT_C void RMemSpySession::GetSwmtTimerIntervalL(TInt& aPeriod)
hgs
parents:
diff changeset
   836
	{
hgs
parents:
diff changeset
   837
	TPckgBuf<TInt> time;
hgs
parents:
diff changeset
   838
	TIpcArgs args( &time );
hgs
parents:
diff changeset
   839
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerPeriodGet,
hgs
parents:
diff changeset
   840
			args));
hgs
parents:
diff changeset
   841
	aPeriod = time();
hgs
parents:
diff changeset
   842
	}
hgs
parents:
diff changeset
   843
hgs
parents:
diff changeset
   844
EXPORT_C TInt TMemSpyDeviceWideOperationProgress::Progress() const 
hgs
parents:
diff changeset
   845
	{
hgs
parents:
diff changeset
   846
	return iProgress();
hgs
parents:
diff changeset
   847
	}
hgs
parents:
diff changeset
   848
hgs
parents:
diff changeset
   849
EXPORT_C const TDesC& TMemSpyDeviceWideOperationProgress::Description() const
hgs
parents:
diff changeset
   850
	{
hgs
parents:
diff changeset
   851
	return iDescription;
hgs
parents:
diff changeset
   852
	}
hgs
parents:
diff changeset
   853
hgs
parents:
diff changeset
   854
// Servers
hgs
parents:
diff changeset
   855
EXPORT_C void RMemSpySession::GetServersL(RArray<CMemSpyApiServer*> &aServers)
hgs
parents:
diff changeset
   856
    {
hgs
parents:
diff changeset
   857
    TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   858
    User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetServerCount, TIpcArgs(&count)));
hgs
parents:
diff changeset
   859
    
hgs
parents:
diff changeset
   860
    TInt requestedCount = count();
hgs
parents:
diff changeset
   861
    HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyServerData));
hgs
parents:
diff changeset
   862
    TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   863
    
hgs
parents:
diff changeset
   864
    User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetServers, TIpcArgs(&count, &bufferPtr)));
hgs
parents:
diff changeset
   865
    aServers.Reset();
hgs
parents:
diff changeset
   866
    
hgs
parents:
diff changeset
   867
    TInt receivedCount = Min(count(), requestedCount);
hgs
parents:
diff changeset
   868
    for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyServerData))
hgs
parents:
diff changeset
   869
        {
hgs
parents:
diff changeset
   870
        TPckgBuf<TMemSpyServerData> data;
hgs
parents:
diff changeset
   871
        data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyServerData));
hgs
parents:
diff changeset
   872
        aServers.AppendL(CMemSpyApiServer::NewLC(data()));
hgs
parents:
diff changeset
   873
        }
hgs
parents:
diff changeset
   874
    CleanupStack::Pop(aServers.Count());
hgs
parents:
diff changeset
   875
    CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   876
    }
hgs
parents:
diff changeset
   877
hgs
parents:
diff changeset
   878
EXPORT_C void RMemSpySession::GetServersL(RArray<CMemSpyApiServer*> &aServers, TSortType aSortType)
hgs
parents:
diff changeset
   879
	{
hgs
parents:
diff changeset
   880
	TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   881
	TPckgBuf<TSortType> sort( aSortType );
hgs
parents:
diff changeset
   882
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetServerCount, TIpcArgs(&count)));
hgs
parents:
diff changeset
   883
	    	
hgs
parents:
diff changeset
   884
	TInt requestedCount = count();
hgs
parents:
diff changeset
   885
	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyServerData));
hgs
parents:
diff changeset
   886
	TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   887
	    
hgs
parents:
diff changeset
   888
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetSortedServers, TIpcArgs(&count, &bufferPtr, &sort)));
hgs
parents:
diff changeset
   889
	aServers.Reset();
hgs
parents:
diff changeset
   890
	    
hgs
parents:
diff changeset
   891
	TInt receivedCount = Min(count(), requestedCount);
hgs
parents:
diff changeset
   892
	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyServerData))
hgs
parents:
diff changeset
   893
		{
hgs
parents:
diff changeset
   894
		TPckgBuf<TMemSpyServerData> data;
hgs
parents:
diff changeset
   895
		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyServerData));
hgs
parents:
diff changeset
   896
		aServers.AppendL(CMemSpyApiServer::NewLC(data()));
hgs
parents:
diff changeset
   897
		}
hgs
parents:
diff changeset
   898
	CleanupStack::Pop(aServers.Count());
hgs
parents:
diff changeset
   899
	CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   900
	}
hgs
parents:
diff changeset
   901
hgs
parents:
diff changeset
   902
EXPORT_C void RMemSpySession::ServerListOutputGenericL( TBool aDetailed )
hgs
parents:
diff changeset
   903
	{
hgs
parents:
diff changeset
   904
	TPckgBuf<TBool> detailed( aDetailed );
hgs
parents:
diff changeset
   905
	TIpcArgs args( &detailed );
hgs
parents:
diff changeset
   906
	User::LeaveIfError( SendReceive( EMemSpyClientServerOpServerListOutputGeneric, args ) );
hgs
parents:
diff changeset
   907
	}
hgs
parents:
diff changeset
   908