memspy/MemSpyClient/src/memspysession.cpp
author hgs
Mon, 28 Jun 2010 15:36:07 +0300
changeset 30 86a2e675b80a
parent 20 a71a3e32a2ae
permissions -rw-r--r--
201025
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20
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"
30
hgs
parents: 20
diff changeset
    20
20
hgs
parents:
diff changeset
    21
#include <memspyengineclientinterface.h>
30
hgs
parents: 20
diff changeset
    22
// API
hgs
parents: 20
diff changeset
    23
#include <memspy/engine/memspyprocessdata.h>
hgs
parents: 20
diff changeset
    24
#include <memspy/engine/memspythreaddata.h> 
hgs
parents: 20
diff changeset
    25
#include <memspy/engine/memspykernelobjectdata.h>
hgs
parents: 20
diff changeset
    26
#include <memspy/engine/memspyheapdata.h>
hgs
parents: 20
diff changeset
    27
#include <memspy/engine/memspymemorytrackingcycledata.h>
20
hgs
parents:
diff changeset
    28
//KernelObjects
hgs
parents:
diff changeset
    29
#include <memspy/driver/memspydriverenumerationsshared.h>
hgs
parents:
diff changeset
    30
// IMPLEMENTATION
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
EXPORT_C RMemSpySession::RMemSpySession()
hgs
parents:
diff changeset
    33
    {
hgs
parents:
diff changeset
    34
    }
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
EXPORT_C TInt RMemSpySession::Connect()
hgs
parents:
diff changeset
    38
    {
hgs
parents:
diff changeset
    39
	TInt error(KErrNone);
hgs
parents:
diff changeset
    40
	
hgs
parents:
diff changeset
    41
	for (TInt i=0; i<2; i++) // Two retries max
hgs
parents:
diff changeset
    42
		{
hgs
parents:
diff changeset
    43
		TInt error = CreateSession(KMemSpyServerName, TVersion(KMemSpyVersion, 0, 0));
hgs
parents:
diff changeset
    44
		
hgs
parents:
diff changeset
    45
		if (error != KErrNotFound && error != KErrServerTerminated)
hgs
parents:
diff changeset
    46
			return error;
hgs
parents:
diff changeset
    47
		
hgs
parents:
diff changeset
    48
		error = StartServer();
hgs
parents:
diff changeset
    49
		
hgs
parents:
diff changeset
    50
		if (error != KErrNone && error != KErrAlreadyExists)
hgs
parents:
diff changeset
    51
			return error;
hgs
parents:
diff changeset
    52
		}
hgs
parents:
diff changeset
    53
	
hgs
parents:
diff changeset
    54
	return error;	
hgs
parents:
diff changeset
    55
    }
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
TInt RMemSpySession::StartServer()
hgs
parents:
diff changeset
    58
	{
hgs
parents:
diff changeset
    59
	RProcess server;
hgs
parents:
diff changeset
    60
	_LIT(KCommand, "start");
hgs
parents:
diff changeset
    61
	const TUid KServerUid3 = {0xE5883BC2};
hgs
parents:
diff changeset
    62
	TInt error = server.Create(KMemSpyServerName, KCommand);//, KServerUid3);
hgs
parents:
diff changeset
    63
	
hgs
parents:
diff changeset
    64
	if (error != KErrNone)
hgs
parents:
diff changeset
    65
		return error;
hgs
parents:
diff changeset
    66
	
hgs
parents:
diff changeset
    67
	TRequestStatus startStatus, stopStatus;
hgs
parents:
diff changeset
    68
	server.Logon(stopStatus);
hgs
parents:
diff changeset
    69
	if (stopStatus != KRequestPending)
hgs
parents:
diff changeset
    70
		{
hgs
parents:
diff changeset
    71
		User::WaitForRequest(stopStatus);
hgs
parents:
diff changeset
    72
		server.Kill(0);
hgs
parents:
diff changeset
    73
		server.Close();
hgs
parents:
diff changeset
    74
		return stopStatus.Int();
hgs
parents:
diff changeset
    75
		}
hgs
parents:
diff changeset
    76
	
hgs
parents:
diff changeset
    77
	server.Rendezvous(startStatus);
hgs
parents:
diff changeset
    78
	server.Resume();
hgs
parents:
diff changeset
    79
	User::WaitForRequest(startStatus, stopStatus);
hgs
parents:
diff changeset
    80
	if (startStatus == KRequestPending)
hgs
parents:
diff changeset
    81
		{
hgs
parents:
diff changeset
    82
		// not started yet, i.e. stopStatus was signaled
hgs
parents:
diff changeset
    83
		server.Close();
hgs
parents:
diff changeset
    84
		return stopStatus.Int();
hgs
parents:
diff changeset
    85
		}
hgs
parents:
diff changeset
    86
	
hgs
parents:
diff changeset
    87
	// Rendezvous was called - the server is ready
hgs
parents:
diff changeset
    88
	
hgs
parents:
diff changeset
    89
	// We first need to cancel Logon
hgs
parents:
diff changeset
    90
	server.LogonCancel(stopStatus);
hgs
parents:
diff changeset
    91
	// We don't need this anymore
hgs
parents:
diff changeset
    92
	server.Close();
hgs
parents:
diff changeset
    93
	// Wait for LogonCancel to complete
hgs
parents:
diff changeset
    94
	User::WaitForRequest(stopStatus);
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
	// Everything went OK
hgs
parents:
diff changeset
    97
	return KErrNone;
hgs
parents:
diff changeset
    98
	}
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
EXPORT_C void RMemSpySession::GetProcessesL(RArray<CMemSpyApiProcess*> &aProcesses, TSortType aSortType)
hgs
parents:
diff changeset
   101
	{
hgs
parents:
diff changeset
   102
	TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   103
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetProcessCount, TIpcArgs(&count)));
hgs
parents:
diff changeset
   104
	
hgs
parents:
diff changeset
   105
	TInt requestedCount = count();
hgs
parents:
diff changeset
   106
	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyProcessData));
hgs
parents:
diff changeset
   107
	TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   108
	
hgs
parents:
diff changeset
   109
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetProcesses, TIpcArgs(&count, &bufferPtr)));
hgs
parents:
diff changeset
   110
	aProcesses.Reset();
hgs
parents:
diff changeset
   111
	
hgs
parents:
diff changeset
   112
	TInt receivedCount = Min(count(), requestedCount);
hgs
parents:
diff changeset
   113
	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyProcessData))
hgs
parents:
diff changeset
   114
		{
hgs
parents:
diff changeset
   115
		TPckgBuf<TMemSpyProcessData> data;
hgs
parents:
diff changeset
   116
		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyProcessData));
hgs
parents:
diff changeset
   117
		aProcesses.AppendL(CMemSpyApiProcess::NewLC(data()));
hgs
parents:
diff changeset
   118
		}
hgs
parents:
diff changeset
   119
	CleanupStack::Pop(aProcesses.Count());
hgs
parents:
diff changeset
   120
	CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   121
	}
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
EXPORT_C TProcessId RMemSpySession::GetProcessIdByNameL(const TDesC& aProcessName)
hgs
parents:
diff changeset
   124
	{
hgs
parents:
diff changeset
   125
	TPckgBuf<TProcessId> procId;
hgs
parents:
diff changeset
   126
	User::LeaveIfError(SendReceive(EMemSpyClienServerOpGetProcessIdByName, 
hgs
parents:
diff changeset
   127
			TIpcArgs(&aProcessName, &procId)));
hgs
parents:
diff changeset
   128
	
hgs
parents:
diff changeset
   129
	return procId();
hgs
parents:
diff changeset
   130
	}
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
EXPORT_C TInt RMemSpySession::ProcessSystemPermanentOrCritical( TProcessId aId, TBool aValue )
hgs
parents:
diff changeset
   133
	{
hgs
parents:
diff changeset
   134
	TPckgBuf<TProcessId> arg1( aId );
hgs
parents:
diff changeset
   135
	TPckgBuf<TBool> arg2( aValue );
hgs
parents:
diff changeset
   136
	TIpcArgs args( &arg1, &arg2 );
hgs
parents:
diff changeset
   137
		
hgs
parents:
diff changeset
   138
	TInt error = SendReceive( EMemSpyClientServerOpProcessSystemPermanentOrCritical, args );
hgs
parents:
diff changeset
   139
	
hgs
parents:
diff changeset
   140
	return error;
hgs
parents:
diff changeset
   141
	}
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
EXPORT_C TInt RMemSpySession::EndProcess( TProcessId aId, TMemSpyEndType aType )
hgs
parents:
diff changeset
   144
	{
hgs
parents:
diff changeset
   145
	TPckgBuf<TProcessId> arg1( aId );
hgs
parents:
diff changeset
   146
	TPckgBuf<TMemSpyEndType> arg2( aType );
hgs
parents:
diff changeset
   147
	TIpcArgs args( &arg1, &arg2 );
hgs
parents:
diff changeset
   148
	
hgs
parents:
diff changeset
   149
	TInt error = SendReceive( EMemSpyClientServerOpEndProcess, args );
hgs
parents:
diff changeset
   150
	
hgs
parents:
diff changeset
   151
	return error;
hgs
parents:
diff changeset
   152
	}
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
EXPORT_C TInt RMemSpySession::SwitchToProcess( TProcessId aId, TBool aBrought )
hgs
parents:
diff changeset
   155
	{
hgs
parents:
diff changeset
   156
	TPckgBuf<TProcessId> arg1( aId );
hgs
parents:
diff changeset
   157
	TPckgBuf<TBool> arg2( aBrought );
hgs
parents:
diff changeset
   158
	TIpcArgs args( &arg1, &arg2 );
hgs
parents:
diff changeset
   159
	
hgs
parents:
diff changeset
   160
	TInt error = SendReceive( EMemSpyClientServerOpSwitchToProcess, args );
hgs
parents:
diff changeset
   161
	
hgs
parents:
diff changeset
   162
	return error;	
hgs
parents:
diff changeset
   163
	}
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
EXPORT_C void RMemSpySession::GetThreadsL(TProcessId aProcessId, RArray<CMemSpyApiThread*> &aThreads, TSortType aSortType)
hgs
parents:
diff changeset
   166
	{
hgs
parents:
diff changeset
   167
	TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   168
	TPckgBuf<TProcessId> pid(aProcessId);
hgs
parents:
diff changeset
   169
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetThreadCount, TIpcArgs(&count, &pid)));
hgs
parents:
diff changeset
   170
	
hgs
parents:
diff changeset
   171
	TInt requestedCount = count();
hgs
parents:
diff changeset
   172
	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyThreadData));
hgs
parents:
diff changeset
   173
	TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   174
	
hgs
parents:
diff changeset
   175
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetThreads, TIpcArgs(&count, &bufferPtr, &pid)));
hgs
parents:
diff changeset
   176
	aThreads.Reset();
hgs
parents:
diff changeset
   177
	
hgs
parents:
diff changeset
   178
	TInt receivedCount = Min(count(), requestedCount);
hgs
parents:
diff changeset
   179
	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyThreadData))
hgs
parents:
diff changeset
   180
		{
hgs
parents:
diff changeset
   181
		TPckgBuf<TMemSpyThreadData> data;
hgs
parents:
diff changeset
   182
		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyThreadData));
hgs
parents:
diff changeset
   183
		aThreads.AppendL(CMemSpyApiThread::NewLC(data()));
hgs
parents:
diff changeset
   184
		}
hgs
parents:
diff changeset
   185
	CleanupStack::Pop(aThreads.Count());
hgs
parents:
diff changeset
   186
	CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   187
	}
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
EXPORT_C void RMemSpySession::SetThreadPriorityL(TThreadId aId, TInt aPriority)
hgs
parents:
diff changeset
   190
	{
hgs
parents:
diff changeset
   191
	TPckgBuf<TThreadId> arg1( aId );
hgs
parents:
diff changeset
   192
	TPckgBuf<TInt> arg2( aPriority );
hgs
parents:
diff changeset
   193
	
hgs
parents:
diff changeset
   194
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpSetThreadPriority, TIpcArgs(&arg1, &arg2)));
hgs
parents:
diff changeset
   195
	}
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
EXPORT_C TInt RMemSpySession::ThreadSystemPermanentOrCritical( TThreadId aId, TBool aValue )
hgs
parents:
diff changeset
   198
	{
hgs
parents:
diff changeset
   199
	TPckgBuf<TThreadId> arg1( aId );
hgs
parents:
diff changeset
   200
	TPckgBuf<TBool> arg2( aValue );
hgs
parents:
diff changeset
   201
	TIpcArgs args( &arg1, &arg2 );
hgs
parents:
diff changeset
   202
	
hgs
parents:
diff changeset
   203
	TInt error = SendReceive( EMemSpyClientServerOpThreadSystemPermanentOrCritical, args );
hgs
parents:
diff changeset
   204
	
hgs
parents:
diff changeset
   205
	return error;
hgs
parents:
diff changeset
   206
	}
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
EXPORT_C TInt RMemSpySession::EndThread( TThreadId aId, TMemSpyEndType aType )
hgs
parents:
diff changeset
   209
	{
hgs
parents:
diff changeset
   210
	TPckgBuf<TThreadId> arg1( aId );
hgs
parents:
diff changeset
   211
	TPckgBuf<TMemSpyEndType> arg2( aType );
hgs
parents:
diff changeset
   212
	TIpcArgs args( &arg1, &arg2 );
hgs
parents:
diff changeset
   213
	
hgs
parents:
diff changeset
   214
	TInt error = SendReceive( EMemSpyClientServerOpEndThread, args );
hgs
parents:
diff changeset
   215
	
hgs
parents:
diff changeset
   216
	return error;
hgs
parents:
diff changeset
   217
	}
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
EXPORT_C TInt RMemSpySession::SwitchToThread( TThreadId aId, TBool aBrought )
hgs
parents:
diff changeset
   220
	{
hgs
parents:
diff changeset
   221
	TPckgBuf<TThreadId> arg1( aId );
hgs
parents:
diff changeset
   222
	TPckgBuf<TBool> arg2( aBrought );
hgs
parents:
diff changeset
   223
	TIpcArgs args( &arg1, &arg2 );
hgs
parents:
diff changeset
   224
	
hgs
parents:
diff changeset
   225
	TInt error = SendReceive( EMemSpyClientServerOpSwitchToThread, args );
hgs
parents:
diff changeset
   226
	
hgs
parents:
diff changeset
   227
	return error;	
hgs
parents:
diff changeset
   228
	}
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
EXPORT_C TInt RMemSpySession::GetInfoItemType( TInt aIndex, TThreadId aId, TMemSpyThreadInfoItemType &aType )
hgs
parents:
diff changeset
   231
	{
hgs
parents:
diff changeset
   232
	TPckgBuf<TInt> arg1( aIndex );
hgs
parents:
diff changeset
   233
	TPckgBuf<TThreadId> arg2( aId );
hgs
parents:
diff changeset
   234
	TPckgBuf<TMemSpyThreadInfoItemType> arg3;
hgs
parents:
diff changeset
   235
	TIpcArgs args( &arg1, &arg2, &arg3 );
hgs
parents:
diff changeset
   236
		
hgs
parents:
diff changeset
   237
	TInt error = SendReceive( EMemSpyClientServerOpGetInfoItemType, args );
hgs
parents:
diff changeset
   238
	
hgs
parents:
diff changeset
   239
	aType = arg3();
hgs
parents:
diff changeset
   240
	
hgs
parents:
diff changeset
   241
	return error;
hgs
parents:
diff changeset
   242
	}
hgs
parents:
diff changeset
   243
30
hgs
parents: 20
diff changeset
   244
EXPORT_C void RMemSpySession::GetThreadInfoItemsL( RArray<CMemSpyApiThreadInfoItem*> &aInfoItems, TThreadId aId, TMemSpyThreadInfoItemType aType )
20
hgs
parents:
diff changeset
   245
	{
hgs
parents:
diff changeset
   246
	TPckgBuf<TThreadId> id( aId );	
hgs
parents:
diff changeset
   247
	TPckgBuf<TMemSpyThreadInfoItemType> type( aType );
hgs
parents:
diff changeset
   248
	TPckgBuf<TInt> count;	
hgs
parents:
diff changeset
   249
	
hgs
parents:
diff changeset
   250
	TInt error = SendReceive( EMemSpyClientServerOpGetThreadInfoItemsCount, TIpcArgs( &id, &type, &count ) );
hgs
parents:
diff changeset
   251
	TInt itemCount = count();
hgs
parents:
diff changeset
   252
	
hgs
parents:
diff changeset
   253
	if( error == KErrNone )
hgs
parents:
diff changeset
   254
		{		
hgs
parents:
diff changeset
   255
		if( itemCount == 0 )
hgs
parents:
diff changeset
   256
			{
hgs
parents:
diff changeset
   257
			aInfoItems.Reset();
hgs
parents:
diff changeset
   258
			}
hgs
parents:
diff changeset
   259
		else
hgs
parents:
diff changeset
   260
			{
hgs
parents:
diff changeset
   261
			HBufC8* buffer = HBufC8::NewLC( itemCount * sizeof(TMemSpyThreadInfoItemData) );
hgs
parents:
diff changeset
   262
			TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   263
			
hgs
parents:
diff changeset
   264
			TPckgBuf<TInt> requestedCount( itemCount );
hgs
parents:
diff changeset
   265
			
hgs
parents:
diff changeset
   266
			TIpcArgs args( &requestedCount, &id, &type, &bufferPtr );
hgs
parents:
diff changeset
   267
			TInt error = SendReceive( EMemSpyClientServerOpGetThreadInfoItems, args );
30
hgs
parents: 20
diff changeset
   268
			
hgs
parents: 20
diff changeset
   269
			aInfoItems.Reset();
20
hgs
parents:
diff changeset
   270
		
hgs
parents:
diff changeset
   271
			for(TInt i=0, offset = 0; i < itemCount; i++, offset+=sizeof(TMemSpyThreadInfoItemData))
hgs
parents:
diff changeset
   272
				{
hgs
parents:
diff changeset
   273
				TPckgBuf<TMemSpyThreadInfoItemData> data;
hgs
parents:
diff changeset
   274
				data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyThreadInfoItemData));
30
hgs
parents: 20
diff changeset
   275
				aInfoItems.AppendL(CMemSpyApiThreadInfoItem::NewLC(data()));
20
hgs
parents:
diff changeset
   276
				}
30
hgs
parents: 20
diff changeset
   277
			
hgs
parents: 20
diff changeset
   278
			CleanupStack::Pop(aInfoItems.Count());
20
hgs
parents:
diff changeset
   279
			CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   280
			}
30
hgs
parents: 20
diff changeset
   281
		}
hgs
parents: 20
diff changeset
   282
	
hgs
parents: 20
diff changeset
   283
	User::LeaveIfError(error);
hgs
parents: 20
diff changeset
   284
	}
hgs
parents: 20
diff changeset
   285
hgs
parents: 20
diff changeset
   286
EXPORT_C TInt RMemSpySession::GetThreadInfoItems( RArray<CMemSpyApiThreadInfoItem*> &aInfoItems, TThreadId aId, TMemSpyThreadInfoItemType aType )
hgs
parents: 20
diff changeset
   287
	{
hgs
parents: 20
diff changeset
   288
	TRAPD(error, GetThreadInfoItemsL(aInfoItems, aId, aType));
hgs
parents: 20
diff changeset
   289
	return error;
20
hgs
parents:
diff changeset
   290
	}
hgs
parents:
diff changeset
   291
hgs
parents:
diff changeset
   292
//Kernel Objects specific operations
30
hgs
parents: 20
diff changeset
   293
EXPORT_C void RMemSpySession::GetKernelObjectsL( RArray<CMemSpyApiKernelObject*> &aKernelObjects )
20
hgs
parents:
diff changeset
   294
	{		
hgs
parents:
diff changeset
   295
	TPckgBuf<TInt> count;
30
hgs
parents: 20
diff changeset
   296
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectCount, TIpcArgs(&count) ));
hgs
parents: 20
diff changeset
   297
	
hgs
parents: 20
diff changeset
   298
	TInt requestedCount = count();
hgs
parents: 20
diff changeset
   299
	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyKernelObjectData));
hgs
parents: 20
diff changeset
   300
	TPtr8 bufferPtr(buffer->Des());
hgs
parents: 20
diff changeset
   301
		
hgs
parents: 20
diff changeset
   302
	TIpcArgs args( &count, &bufferPtr );
hgs
parents: 20
diff changeset
   303
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjects, args ));
hgs
parents: 20
diff changeset
   304
	
hgs
parents: 20
diff changeset
   305
	aKernelObjects.Reset();
hgs
parents: 20
diff changeset
   306
	
hgs
parents: 20
diff changeset
   307
	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyKernelObjectData))
hgs
parents: 20
diff changeset
   308
		{
hgs
parents: 20
diff changeset
   309
		TPckgBuf<TMemSpyKernelObjectData> data;
hgs
parents: 20
diff changeset
   310
		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyKernelObjectData));
hgs
parents: 20
diff changeset
   311
		aKernelObjects.AppendL(CMemSpyApiKernelObject::NewLC(data()));
hgs
parents: 20
diff changeset
   312
		}
20
hgs
parents:
diff changeset
   313
	
30
hgs
parents: 20
diff changeset
   314
	CleanupStack::Pop(aKernelObjects.Count());
hgs
parents: 20
diff changeset
   315
	CleanupStack::PopAndDestroy(buffer);
hgs
parents: 20
diff changeset
   316
	}
hgs
parents: 20
diff changeset
   317
hgs
parents: 20
diff changeset
   318
EXPORT_C TInt RMemSpySession::GetKernelObjects( RArray<CMemSpyApiKernelObject*> &aKernelObjects )
hgs
parents: 20
diff changeset
   319
	{
hgs
parents: 20
diff changeset
   320
	TRAPD(error, GetKernelObjectsL(aKernelObjects));
hgs
parents: 20
diff changeset
   321
	return error;
hgs
parents: 20
diff changeset
   322
	}
hgs
parents: 20
diff changeset
   323
hgs
parents: 20
diff changeset
   324
EXPORT_C void RMemSpySession::GetKernelObjectItemsL( RArray<CMemSpyApiKernelObjectItem*> &aKernelObjectItems, TMemSpyDriverContainerType aForContainer )
hgs
parents: 20
diff changeset
   325
	{
hgs
parents: 20
diff changeset
   326
	TPckgBuf<TInt> count;
hgs
parents: 20
diff changeset
   327
	TPckgBuf<TMemSpyDriverContainerType> type(aForContainer);
hgs
parents: 20
diff changeset
   328
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectItemCount, TIpcArgs(&count, &type) ));
hgs
parents: 20
diff changeset
   329
hgs
parents: 20
diff changeset
   330
	TInt requestedCount = count();
hgs
parents: 20
diff changeset
   331
	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyDriverHandleInfoGeneric));
hgs
parents: 20
diff changeset
   332
	TPtr8 bufferPtr(buffer->Des());
hgs
parents: 20
diff changeset
   333
	
hgs
parents: 20
diff changeset
   334
	TIpcArgs args( &count, &type, &bufferPtr );
hgs
parents: 20
diff changeset
   335
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectItems, args ));
hgs
parents: 20
diff changeset
   336
	
hgs
parents: 20
diff changeset
   337
	aKernelObjectItems.Reset();
hgs
parents: 20
diff changeset
   338
	
hgs
parents: 20
diff changeset
   339
	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyDriverHandleInfoGeneric))
hgs
parents: 20
diff changeset
   340
		{
hgs
parents: 20
diff changeset
   341
		TPckgBuf<TMemSpyDriverHandleInfoGeneric> data;
hgs
parents: 20
diff changeset
   342
		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyDriverHandleInfoGeneric));
hgs
parents: 20
diff changeset
   343
		aKernelObjectItems.AppendL( CMemSpyApiKernelObjectItem::NewLC( data() ) );
hgs
parents: 20
diff changeset
   344
		}
hgs
parents: 20
diff changeset
   345
	CleanupStack::Pop(aKernelObjectItems.Count());
hgs
parents: 20
diff changeset
   346
	CleanupStack::PopAndDestroy(buffer);
20
hgs
parents:
diff changeset
   347
	}
hgs
parents:
diff changeset
   348
hgs
parents:
diff changeset
   349
EXPORT_C TInt RMemSpySession::GetKernelObjectItems( RArray<CMemSpyApiKernelObjectItem*> &aKernelObjectItems, TMemSpyDriverContainerType aForContainer )
hgs
parents:
diff changeset
   350
	{
30
hgs
parents: 20
diff changeset
   351
	TRAPD(error, GetKernelObjectItemsL(aKernelObjectItems, aForContainer));
hgs
parents: 20
diff changeset
   352
	return error;
hgs
parents: 20
diff changeset
   353
	}
hgs
parents: 20
diff changeset
   354
hgs
parents: 20
diff changeset
   355
EXPORT_C void RMemSpySession::GetMemoryTrackingCyclesL(RArray<CMemSpyApiMemoryTrackingCycle*>& aCycles)
hgs
parents: 20
diff changeset
   356
	{
20
hgs
parents:
diff changeset
   357
	TPckgBuf<TInt> count;
30
hgs
parents: 20
diff changeset
   358
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetMemoryTrackingCycleCount, TIpcArgs(&count) ));
hgs
parents: 20
diff changeset
   359
	
hgs
parents: 20
diff changeset
   360
	TInt requestedCount = count();
hgs
parents: 20
diff changeset
   361
	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyMemoryTrackingCycleData));
hgs
parents: 20
diff changeset
   362
	TPtr8 bufferPtr(buffer->Des());
20
hgs
parents:
diff changeset
   363
		
30
hgs
parents: 20
diff changeset
   364
	TIpcArgs args( &count, &bufferPtr );
hgs
parents: 20
diff changeset
   365
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetMemoryTrackingCycles, args ));
hgs
parents: 20
diff changeset
   366
	
hgs
parents: 20
diff changeset
   367
	aCycles.Reset();
hgs
parents: 20
diff changeset
   368
	
hgs
parents: 20
diff changeset
   369
	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyMemoryTrackingCycleData))
hgs
parents: 20
diff changeset
   370
		{
hgs
parents: 20
diff changeset
   371
		TPckgBuf<TMemSpyMemoryTrackingCycleData> data;
hgs
parents: 20
diff changeset
   372
		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyMemoryTrackingCycleData));
hgs
parents: 20
diff changeset
   373
		aCycles.AppendL(CMemSpyApiMemoryTrackingCycle::NewLC(data()));
20
hgs
parents:
diff changeset
   374
		}
30
hgs
parents: 20
diff changeset
   375
	
hgs
parents: 20
diff changeset
   376
	CleanupStack::Pop(aCycles.Count());
hgs
parents: 20
diff changeset
   377
	CleanupStack::PopAndDestroy(buffer);
20
hgs
parents:
diff changeset
   378
	}
hgs
parents:
diff changeset
   379
hgs
parents:
diff changeset
   380
EXPORT_C void RMemSpySession::OutputAllContainerContents()
hgs
parents:
diff changeset
   381
	{
hgs
parents:
diff changeset
   382
	SendReceive( EMemSpyClientServerOpOutputAllContainerContents );
hgs
parents:
diff changeset
   383
	}
hgs
parents:
diff changeset
   384
hgs
parents:
diff changeset
   385
hgs
parents:
diff changeset
   386
//Heap specific operations
30
hgs
parents: 20
diff changeset
   387
hgs
parents: 20
diff changeset
   388
EXPORT_C CMemSpyApiHeap* RMemSpySession::GetHeapL()
20
hgs
parents:
diff changeset
   389
	{
hgs
parents:
diff changeset
   390
	CMemSpyApiHeap* aHeap;
hgs
parents:
diff changeset
   391
	
hgs
parents:
diff changeset
   392
	HBufC8* buffer = HBufC8::NewLC( sizeof(TMemSpyHeapData) );
hgs
parents:
diff changeset
   393
	TPtr8 bufferPtr(buffer->Des());
hgs
parents:
diff changeset
   394
	TIpcArgs args( &bufferPtr );
hgs
parents:
diff changeset
   395
	
30
hgs
parents: 20
diff changeset
   396
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetHeap, args ));
20
hgs
parents:
diff changeset
   397
	
30
hgs
parents: 20
diff changeset
   398
	TPckgBuf<TMemSpyHeapData> data;
hgs
parents: 20
diff changeset
   399
	data.Copy(bufferPtr.Ptr(), sizeof(TMemSpyHeapData));		
hgs
parents: 20
diff changeset
   400
	aHeap = CMemSpyApiHeap::NewL( data() );
hgs
parents: 20
diff changeset
   401
	
20
hgs
parents:
diff changeset
   402
	CleanupStack::PopAndDestroy(buffer);
hgs
parents:
diff changeset
   403
		
hgs
parents:
diff changeset
   404
	return aHeap;
hgs
parents:
diff changeset
   405
	}
hgs
parents:
diff changeset
   406
30
hgs
parents: 20
diff changeset
   407
EXPORT_C CMemSpyApiHeap* RMemSpySession::GetHeap()
hgs
parents: 20
diff changeset
   408
	{
hgs
parents: 20
diff changeset
   409
	CMemSpyApiHeap *result = NULL;
hgs
parents: 20
diff changeset
   410
	TRAPD(error, result = GetHeapL());
hgs
parents: 20
diff changeset
   411
	return error == KErrNone ? result : NULL;
hgs
parents: 20
diff changeset
   412
	}
hgs
parents: 20
diff changeset
   413
20
hgs
parents:
diff changeset
   414
EXPORT_C void RMemSpySession::DumpKernelHeap()
hgs
parents:
diff changeset
   415
	{
hgs
parents:
diff changeset
   416
	SendReceive( EMemSpyClientServerOpDumpKernelHeap );
hgs
parents:
diff changeset
   417
	}
hgs
parents:
diff changeset
   418
30
hgs
parents: 20
diff changeset
   419
EXPORT_C void RMemSpySession::OutputKernelHeapDataL()
hgs
parents: 20
diff changeset
   420
	{		
20
hgs
parents:
diff changeset
   421
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpHeapData | KMemSpyOpFlagsIncludesThreadId,
hgs
parents:
diff changeset
   422
			TIpcArgs(KMemSpyClientServerThreadIdKernel)));
hgs
parents:
diff changeset
   423
	
hgs
parents:
diff changeset
   424
	}
30
hgs
parents: 20
diff changeset
   425
hgs
parents: 20
diff changeset
   426
EXPORT_C void RMemSpySession::OutputKernelHeapData(TRequestStatus& aStatus)
20
hgs
parents:
diff changeset
   427
	{
30
hgs
parents: 20
diff changeset
   428
	SendReceive(EMemSpyClientServerOpHeapData,
hgs
parents: 20
diff changeset
   429
		TIpcArgs(KMemSpyClientServerThreadIdKernel),
hgs
parents: 20
diff changeset
   430
		aStatus);
hgs
parents: 20
diff changeset
   431
	}
hgs
parents: 20
diff changeset
   432
hgs
parents: 20
diff changeset
   433
EXPORT_C void RMemSpySession::OutputThreadHeapDataL( TThreadId aThreadId)
hgs
parents: 20
diff changeset
   434
	{			
20
hgs
parents:
diff changeset
   435
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpHeapData | KMemSpyOpFlagsIncludesThreadId,
hgs
parents:
diff changeset
   436
			TIpcArgs(aThreadId)));
hgs
parents:
diff changeset
   437
	}
30
hgs
parents: 20
diff changeset
   438
hgs
parents: 20
diff changeset
   439
EXPORT_C void RMemSpySession::OutputThreadHeapDataL(const TDesC& aThreadName)
hgs
parents: 20
diff changeset
   440
	{	
hgs
parents: 20
diff changeset
   441
	const TIpcArgs args( &aThreadName );
hgs
parents: 20
diff changeset
   442
	        
hgs
parents: 20
diff changeset
   443
	User::LeaveIfError( SendReceive( EMemSpyClientServerOpHeapData | KMemSpyOpFlagsIncludesThreadName, args ));	
hgs
parents: 20
diff changeset
   444
	}
hgs
parents: 20
diff changeset
   445
hgs
parents: 20
diff changeset
   446
EXPORT_C void RMemSpySession::OutputThreadCellListL(TThreadId aThreadId)
hgs
parents: 20
diff changeset
   447
	{	
20
hgs
parents:
diff changeset
   448
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpHeapCellListing | KMemSpyOpFlagsIncludesThreadId,
hgs
parents:
diff changeset
   449
			TIpcArgs(aThreadId)));
hgs
parents:
diff changeset
   450
	}
hgs
parents:
diff changeset
   451
30
hgs
parents: 20
diff changeset
   452
EXPORT_C void RMemSpySession::OutputHeapInfoUserL(TThreadId aThreadId)
hgs
parents: 20
diff changeset
   453
	{
hgs
parents: 20
diff changeset
   454
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpHeapInfo | KMemSpyOpFlagsIncludesThreadId,
hgs
parents: 20
diff changeset
   455
			TIpcArgs(aThreadId)));
hgs
parents: 20
diff changeset
   456
	}
hgs
parents: 20
diff changeset
   457
hgs
parents: 20
diff changeset
   458
EXPORT_C void RMemSpySession::SwitchOutputSinkL( TMemSpySinkType aType )
hgs
parents: 20
diff changeset
   459
	{
hgs
parents: 20
diff changeset
   460
	TInt op;
hgs
parents: 20
diff changeset
   461
	if( aType == ESinkTypeFile )
hgs
parents: 20
diff changeset
   462
		op = EMemSpyClientServerOpSwitchOutputSinkFile;
hgs
parents: 20
diff changeset
   463
	else
hgs
parents: 20
diff changeset
   464
		op = EMemSpyClientServerOpSwitchOutputSinkTrace;
hgs
parents: 20
diff changeset
   465
			
hgs
parents: 20
diff changeset
   466
	User::LeaveIfError(SendReceive( op ));
hgs
parents: 20
diff changeset
   467
	}
hgs
parents: 20
diff changeset
   468
hgs
parents: 20
diff changeset
   469
EXPORT_C void RMemSpySession::SwitchOutputToTraceL()
hgs
parents: 20
diff changeset
   470
	{
hgs
parents: 20
diff changeset
   471
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSwitchOutputSinkTrace));
hgs
parents: 20
diff changeset
   472
	}
hgs
parents: 20
diff changeset
   473
    
hgs
parents: 20
diff changeset
   474
EXPORT_C void RMemSpySession::SwitchOutputToFileL(const TDesC& aRootFolder)
20
hgs
parents:
diff changeset
   475
	{
30
hgs
parents: 20
diff changeset
   476
	TIpcArgs args;
hgs
parents: 20
diff changeset
   477
	if (aRootFolder.Length())
hgs
parents: 20
diff changeset
   478
		{
hgs
parents: 20
diff changeset
   479
		args.Set(0, &aRootFolder);
hgs
parents: 20
diff changeset
   480
		}
hgs
parents: 20
diff changeset
   481
	
hgs
parents: 20
diff changeset
   482
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSwitchOutputSinkFile, args));
hgs
parents: 20
diff changeset
   483
	}
hgs
parents: 20
diff changeset
   484
hgs
parents: 20
diff changeset
   485
EXPORT_C void RMemSpySession::OutputStackInfoL(TThreadId aThreadId)
hgs
parents: 20
diff changeset
   486
	{
hgs
parents: 20
diff changeset
   487
	User::LeaveIfError(SendReceive( EMemSpyClientServerOpStackInfo | KMemSpyOpFlagsIncludesThreadId,
hgs
parents: 20
diff changeset
   488
			TIpcArgs(aThreadId)));
hgs
parents: 20
diff changeset
   489
	}
hgs
parents: 20
diff changeset
   490
hgs
parents: 20
diff changeset
   491
EXPORT_C void RMemSpySession::OutputStackDataL(TThreadId aThreadId, TMemSpyDriverDomainType aType )
hgs
parents: 20
diff changeset
   492
	{
hgs
parents: 20
diff changeset
   493
	TInt op;
hgs
parents: 20
diff changeset
   494
	if( aType == EMemSpyDriverDomainUser )
hgs
parents: 20
diff changeset
   495
		op = EMemSpyClientServerOpStackDataUser;
hgs
parents: 20
diff changeset
   496
	else
hgs
parents: 20
diff changeset
   497
		op = EMemSpyClientServerOpStackDataKernel;
hgs
parents: 20
diff changeset
   498
	
hgs
parents: 20
diff changeset
   499
	User::LeaveIfError(SendReceive( op | KMemSpyOpFlagsIncludesThreadId,
hgs
parents: 20
diff changeset
   500
			TIpcArgs(aThreadId, aType)));
hgs
parents: 20
diff changeset
   501
		
hgs
parents: 20
diff changeset
   502
	}
hgs
parents: 20
diff changeset
   503
hgs
parents: 20
diff changeset
   504
EXPORT_C void RMemSpySession::OutputThreadInfoHandlesL(TThreadId aThreadId)
hgs
parents: 20
diff changeset
   505
	{
hgs
parents: 20
diff changeset
   506
	TPckgBuf<TThreadId> id(aThreadId);
hgs
parents: 20
diff changeset
   507
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpOutputInfoHandles, TIpcArgs( &id )));	
hgs
parents: 20
diff changeset
   508
	}
hgs
parents: 20
diff changeset
   509
hgs
parents: 20
diff changeset
   510
EXPORT_C void RMemSpySession::OutputAOListL(TThreadId aId, TMemSpyThreadInfoItemType aType)
hgs
parents: 20
diff changeset
   511
	{
hgs
parents: 20
diff changeset
   512
	TPckgBuf<TThreadId> id(aId);
hgs
parents: 20
diff changeset
   513
	TPckgBuf<TMemSpyThreadInfoItemType> type(aType);
hgs
parents: 20
diff changeset
   514
	
hgs
parents: 20
diff changeset
   515
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpOutputAOList, TIpcArgs( &id, &type )));
hgs
parents: 20
diff changeset
   516
	}
hgs
parents: 20
diff changeset
   517
hgs
parents: 20
diff changeset
   518
EXPORT_C void RMemSpySession::OutputKernelObjectsL()
hgs
parents: 20
diff changeset
   519
	{
20
hgs
parents:
diff changeset
   520
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpEnumerateKernelContainerAll));
hgs
parents:
diff changeset
   521
	}
hgs
parents:
diff changeset
   522
30
hgs
parents: 20
diff changeset
   523
EXPORT_C void RMemSpySession::OutputCompactStackInfoL()
20
hgs
parents:
diff changeset
   524
	{
hgs
parents:
diff changeset
   525
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpStackInfoCompact)); 
hgs
parents:
diff changeset
   526
	}
hgs
parents:
diff changeset
   527
30
hgs
parents: 20
diff changeset
   528
EXPORT_C void RMemSpySession::OutputCompactHeapInfoL()
hgs
parents: 20
diff changeset
   529
	{
hgs
parents: 20
diff changeset
   530
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpHeapInfoCompact)); 
hgs
parents: 20
diff changeset
   531
	}
hgs
parents: 20
diff changeset
   532
// Asynchronous operations
hgs
parents: 20
diff changeset
   533
EXPORT_C void RMemSpySession::OutputPhoneInfo(TRequestStatus& aStatus)
hgs
parents: 20
diff changeset
   534
	{	
hgs
parents: 20
diff changeset
   535
	SendReceive(EMemSpyClientServerOpSummaryInfo | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents: 20
diff changeset
   536
	}
hgs
parents: 20
diff changeset
   537
hgs
parents: 20
diff changeset
   538
EXPORT_C void RMemSpySession::OutputDetailedPhoneInfo(TRequestStatus& aStatus)
hgs
parents: 20
diff changeset
   539
	{	
hgs
parents: 20
diff changeset
   540
	SendReceive(EMemSpyClientServerOpSummaryInfoDetailed | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents: 20
diff changeset
   541
	}
hgs
parents: 20
diff changeset
   542
hgs
parents: 20
diff changeset
   543
EXPORT_C void RMemSpySession::OutputHeapInfo(TRequestStatus& aStatus)
hgs
parents: 20
diff changeset
   544
	{	
hgs
parents: 20
diff changeset
   545
	SendReceive(EMemSpyClientServerOpHeapInfo | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents: 20
diff changeset
   546
	}
hgs
parents: 20
diff changeset
   547
hgs
parents: 20
diff changeset
   548
EXPORT_C void RMemSpySession::OutputCompactHeapInfo(TRequestStatus& aStatus)
hgs
parents: 20
diff changeset
   549
	{	
hgs
parents: 20
diff changeset
   550
	SendReceive(EMemSpyClientServerOpHeapInfoCompact | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents: 20
diff changeset
   551
	}
hgs
parents: 20
diff changeset
   552
hgs
parents: 20
diff changeset
   553
EXPORT_C void RMemSpySession::OutputHeapCellListing(TRequestStatus& aStatus)
hgs
parents: 20
diff changeset
   554
	{	
hgs
parents: 20
diff changeset
   555
	SendReceive(EMemSpyClientServerOpHeapCellListing | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents: 20
diff changeset
   556
	}
hgs
parents: 20
diff changeset
   557
hgs
parents: 20
diff changeset
   558
EXPORT_C void RMemSpySession::OutputHeapData(TRequestStatus& aStatus)
hgs
parents: 20
diff changeset
   559
	{	
hgs
parents: 20
diff changeset
   560
	SendReceive(EMemSpyClientServerOpHeapData | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents: 20
diff changeset
   561
	}
hgs
parents: 20
diff changeset
   562
hgs
parents: 20
diff changeset
   563
// synchronous version of the operation - for CLI
hgs
parents: 20
diff changeset
   564
EXPORT_C void RMemSpySession::OutputHeapData()
20
hgs
parents:
diff changeset
   565
	{
30
hgs
parents: 20
diff changeset
   566
	SendReceive(EMemSpyClientServerOpHeapData);
hgs
parents: 20
diff changeset
   567
	}
hgs
parents: 20
diff changeset
   568
hgs
parents: 20
diff changeset
   569
EXPORT_C void RMemSpySession::OutputStackInfo(TRequestStatus& aStatus)
hgs
parents: 20
diff changeset
   570
	{	
hgs
parents: 20
diff changeset
   571
	SendReceive(EMemSpyClientServerOpStackInfo | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents: 20
diff changeset
   572
	}
hgs
parents: 20
diff changeset
   573
hgs
parents: 20
diff changeset
   574
EXPORT_C void RMemSpySession::OutputCompactStackInfo(TRequestStatus& aStatus)
hgs
parents: 20
diff changeset
   575
	{	
hgs
parents: 20
diff changeset
   576
	SendReceive(EMemSpyClientServerOpStackInfoCompact | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents: 20
diff changeset
   577
	}
hgs
parents: 20
diff changeset
   578
hgs
parents: 20
diff changeset
   579
EXPORT_C void RMemSpySession::OutputUserStackData(TRequestStatus& aStatus)
hgs
parents: 20
diff changeset
   580
	{	
hgs
parents: 20
diff changeset
   581
	SendReceive(EMemSpyClientServerOpStackDataUser | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents: 20
diff changeset
   582
	}
hgs
parents: 20
diff changeset
   583
hgs
parents: 20
diff changeset
   584
EXPORT_C void RMemSpySession::OutputKernelStackData(TRequestStatus& aStatus)
hgs
parents: 20
diff changeset
   585
	{	
hgs
parents: 20
diff changeset
   586
	SendReceive(EMemSpyClientServerOpStackDataKernel | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
hgs
parents: 20
diff changeset
   587
	}
hgs
parents: 20
diff changeset
   588
hgs
parents: 20
diff changeset
   589
// Synchronous operations
hgs
parents: 20
diff changeset
   590
EXPORT_C void RMemSpySession::OutputPhoneInfo()
hgs
parents: 20
diff changeset
   591
	{	
hgs
parents: 20
diff changeset
   592
	SendReceive( EMemSpyClientServerOpSummaryInfo , TIpcArgs() );
hgs
parents: 20
diff changeset
   593
	}
hgs
parents: 20
diff changeset
   594
hgs
parents: 20
diff changeset
   595
EXPORT_C void RMemSpySession::SetSwmtConfig( TMemSpyEngineHelperSysMemTrackerConfig aConfig )
hgs
parents: 20
diff changeset
   596
	{
hgs
parents: 20
diff changeset
   597
	TPckgBuf<TMemSpyEngineHelperSysMemTrackerConfig> config(aConfig);
hgs
parents: 20
diff changeset
   598
	TIpcArgs args( &config );
hgs
parents: 20
diff changeset
   599
	
hgs
parents: 20
diff changeset
   600
	SendReceive( EMemSpyClientServerOpSetSwmtConfig, args) ;
hgs
parents: 20
diff changeset
   601
	}
hgs
parents: 20
diff changeset
   602
hgs
parents: 20
diff changeset
   603
EXPORT_C void RMemSpySession::SetSwmtAutoStartProcessList( CArrayFixFlat<TUid>* aList )
hgs
parents: 20
diff changeset
   604
	{
hgs
parents: 20
diff changeset
   605
	TInt count = aList->Count();
hgs
parents: 20
diff changeset
   606
	TIpcArgs args( &aList, &count );
hgs
parents: 20
diff changeset
   607
	
hgs
parents: 20
diff changeset
   608
	SendReceive( EMemSpyClientServerOpSetSwmtAutoStartProcessList, args );
hgs
parents: 20
diff changeset
   609
	}
hgs
parents: 20
diff changeset
   610
hgs
parents: 20
diff changeset
   611
EXPORT_C void RMemSpySession::SwmtResetTracking()
hgs
parents: 20
diff changeset
   612
	{
hgs
parents: 20
diff changeset
   613
	SendReceive( EMemSpyClientServerOpSystemWideMemoryTrackingReset );
20
hgs
parents:
diff changeset
   614
	}
hgs
parents:
diff changeset
   615
30
hgs
parents: 20
diff changeset
   616
EXPORT_C void RMemSpySession::GetOutputSink( TMemSpySinkType aType )
hgs
parents: 20
diff changeset
   617
	{
hgs
parents: 20
diff changeset
   618
	TPckgBuf<TMemSpySinkType> type( aType );
hgs
parents: 20
diff changeset
   619
	TIpcArgs args( &type );
hgs
parents: 20
diff changeset
   620
	
hgs
parents: 20
diff changeset
   621
	SendReceive( EMemSpyClientServerOpGetOutputSink, args );
hgs
parents: 20
diff changeset
   622
	}
hgs
parents: 20
diff changeset
   623
hgs
parents: 20
diff changeset
   624
EXPORT_C void RMemSpySession::NotifyDeviceWideOperationProgress(TMemSpyDeviceWideOperationProgress &aProgress, TRequestStatus &aStatus)
hgs
parents: 20
diff changeset
   625
	{
hgs
parents: 20
diff changeset
   626
	SendReceive(EMemSpyClientServerOpNotifyDeviceWideOperationProgress | KMemSpyOpFlagsAsyncOperation,
hgs
parents: 20
diff changeset
   627
			TIpcArgs(&aProgress.iProgress, &aProgress.iDescription), 
hgs
parents: 20
diff changeset
   628
			aStatus);
hgs
parents: 20
diff changeset
   629
	}
hgs
parents: 20
diff changeset
   630
hgs
parents: 20
diff changeset
   631
EXPORT_C void RMemSpySession::CancelDeviceWideOperationL()
hgs
parents: 20
diff changeset
   632
	{
hgs
parents: 20
diff changeset
   633
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpCancelDeviceWideOperation));
hgs
parents: 20
diff changeset
   634
	}
hgs
parents: 20
diff changeset
   635
hgs
parents: 20
diff changeset
   636
// SWMT operations
hgs
parents: 20
diff changeset
   637
EXPORT_C void RMemSpySession::SetSwmtCategoriesL(TInt aCategories)
hgs
parents: 20
diff changeset
   638
	{
hgs
parents: 20
diff changeset
   639
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingCategoriesSet,
hgs
parents: 20
diff changeset
   640
			TIpcArgs(aCategories)));
hgs
parents: 20
diff changeset
   641
	}
hgs
parents: 20
diff changeset
   642
hgs
parents: 20
diff changeset
   643
EXPORT_C void RMemSpySession::SetSwmtHeapDumpsEnabledL(TBool aEnabled)
hgs
parents: 20
diff changeset
   644
	{
hgs
parents: 20
diff changeset
   645
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingHeapDumpSet,
hgs
parents: 20
diff changeset
   646
			TIpcArgs(aEnabled)));
hgs
parents: 20
diff changeset
   647
	}
hgs
parents: 20
diff changeset
   648
hgs
parents: 20
diff changeset
   649
EXPORT_C TBool RMemSpySession::IsSwmtRunningL()
hgs
parents: 20
diff changeset
   650
	{
hgs
parents: 20
diff changeset
   651
	TPckgBuf<TBool> ret;
hgs
parents: 20
diff changeset
   652
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpIsSwmtRunning, TIpcArgs(&ret)));
hgs
parents: 20
diff changeset
   653
	
hgs
parents: 20
diff changeset
   654
	return ret();
hgs
parents: 20
diff changeset
   655
	}
hgs
parents: 20
diff changeset
   656
hgs
parents: 20
diff changeset
   657
EXPORT_C void RMemSpySession::StartSwmtTimerL(TInt aPeriod)
20
hgs
parents:
diff changeset
   658
	{
30
hgs
parents: 20
diff changeset
   659
	SetSwmtTimerIntervalL(aPeriod);
hgs
parents: 20
diff changeset
   660
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerStart));
hgs
parents: 20
diff changeset
   661
	}
hgs
parents: 20
diff changeset
   662
hgs
parents: 20
diff changeset
   663
EXPORT_C void RMemSpySession::StartSwmtTimerL()
hgs
parents: 20
diff changeset
   664
	{
hgs
parents: 20
diff changeset
   665
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerStart));
hgs
parents: 20
diff changeset
   666
	}
hgs
parents: 20
diff changeset
   667
hgs
parents: 20
diff changeset
   668
EXPORT_C void RMemSpySession::SetSwmtTimerIntervalL(TInt aPeriod)
hgs
parents: 20
diff changeset
   669
	{
hgs
parents: 20
diff changeset
   670
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerPeriodSet,
hgs
parents: 20
diff changeset
   671
			TIpcArgs(aPeriod)));
hgs
parents: 20
diff changeset
   672
	}
hgs
parents: 20
diff changeset
   673
hgs
parents: 20
diff changeset
   674
EXPORT_C void RMemSpySession::StopSwmtTimerL()
hgs
parents: 20
diff changeset
   675
	{
hgs
parents: 20
diff changeset
   676
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerStop));
20
hgs
parents:
diff changeset
   677
	}
30
hgs
parents: 20
diff changeset
   678
hgs
parents: 20
diff changeset
   679
hgs
parents: 20
diff changeset
   680
EXPORT_C void RMemSpySession::ForceSwmtUpdateL()
hgs
parents: 20
diff changeset
   681
	{
hgs
parents: 20
diff changeset
   682
	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingForceUpdate));
hgs
parents: 20
diff changeset
   683
	}
hgs
parents: 20
diff changeset
   684
hgs
parents: 20
diff changeset
   685
EXPORT_C void RMemSpySession::ForceSwmtUpdate(TRequestStatus& aStatus)
hgs
parents: 20
diff changeset
   686
	{
hgs
parents: 20
diff changeset
   687
	SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingForceUpdate, 
hgs
parents: 20
diff changeset
   688
			TIpcArgs(),
hgs
parents: 20
diff changeset
   689
			aStatus);
hgs
parents: 20
diff changeset
   690
	}
hgs
parents: 20
diff changeset
   691
hgs
parents: 20
diff changeset
   692
EXPORT_C void RMemSpySession::SetSwmtFilter( const TDesC& aFilter )
hgs
parents: 20
diff changeset
   693
	{	
hgs
parents: 20
diff changeset
   694
	TIpcArgs args( &aFilter );
hgs
parents: 20
diff changeset
   695
	User::LeaveIfError( SendReceive( EMemSpyClientServerOpSystemWideMemoryTrackingThreadNameFilterSet, args ) );
hgs
parents: 20
diff changeset
   696
	}
hgs
parents: 20
diff changeset
   697
hgs
parents: 20
diff changeset
   698
EXPORT_C TInt TMemSpyDeviceWideOperationProgress::Progress() const 
hgs
parents: 20
diff changeset
   699
	{
hgs
parents: 20
diff changeset
   700
	return iProgress();
hgs
parents: 20
diff changeset
   701
	}
hgs
parents: 20
diff changeset
   702
hgs
parents: 20
diff changeset
   703
EXPORT_C const TDesC& TMemSpyDeviceWideOperationProgress::Description() const
hgs
parents: 20
diff changeset
   704
	{
hgs
parents: 20
diff changeset
   705
	return iDescription;
hgs
parents: 20
diff changeset
   706
	}