--- a/perfsrv/memspy/Driver/User/Source/MemSpyDriverClient.cpp Mon Sep 06 15:00:47 2010 +0300
+++ b/perfsrv/memspy/Driver/User/Source/MemSpyDriverClient.cpp Mon Sep 20 12:20:18 2010 +0300
@@ -499,7 +499,7 @@
params.iDebugAllocator = DebugEUser();
params.iMasterInfo = &aInfo;
//
- TInt r = DoControl( EMemSpyDriverOpCodeHeapInfoGetUser, ¶ms, NULL );
+ TInt r = DoControl( EMemSpyDriverOpCodeHeapUserDataGetInfo, ¶ms, NULL );
//
if ( r == KErrNone )
{
@@ -523,13 +523,18 @@
return r;
}
-EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoUser( TMemSpyHeapInfo& aInfo, TUint aTid, RArray< TMemSpyDriverFreeCell >& aFreeCells )
+EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoUser(TMemSpyHeapInfo& aInfo,
+ TUint aTid,
+ RArray< TMemSpyDriverFreeCell >& aFreeCells)
{
return GetHeapInfoUser(aInfo, aTid, aFreeCells, EFalse);
}
// For the record I don't think this function should be exported, but since the one above was I'm going with the flow. -TomS
-EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoUser(TMemSpyHeapInfo& aInfo, TUint aTid, RArray<TMemSpyDriverCell>& aCells, TBool aCollectAllocatedCellsAsWellAsFree)
+EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoUser(TMemSpyHeapInfo& aInfo,
+ TUint aTid,
+ RArray<TMemSpyDriverCell>& aCells,
+ TBool aCollectAllocatedCellsAsWellAsFree)
{
TMemSpyDriverInternalHeapRequestParameters params;
//
@@ -539,11 +544,10 @@
params.iMasterInfo = &aInfo;
params.iBuildFreeCellList = ETrue;
params.iBuildAllocCellList = aCollectAllocatedCellsAsWellAsFree;
-
//
aCells.Reset();
ResetStreamBuffer();
- TInt r = DoControl( EMemSpyDriverOpCodeHeapInfoGetUser, ¶ms );
+ TInt r = DoControl( EMemSpyDriverOpCodeHeapUserDataGetInfo, ¶ms );
//
if ( r >= KErrNone )
{
@@ -568,7 +572,7 @@
// Now fetch the heap data
if ( r == KErrNone )
{
- r = DoControl( EMemSpyDriverOpCodeHeapInfoFetchCellList, &iBuffer );
+ r = DoControl( EMemSpyDriverOpCodeHeapUserDataFetchCellList, &iBuffer );
if ( r == KErrNone )
{
TRAP( r, ReadHeapInfoFreeCellsFromXferBufferL( aCells ) );
@@ -588,10 +592,12 @@
EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoKernel( TMemSpyHeapInfo& aInfo )
{
TMemSpyDriverInternalHeapRequestParameters params;
+ //
params.iTid = KMemSpyDriverGetKernelHeapDataPseudoThreadId;
params.iRHeapVTable = NULL;
params.iMasterInfo = &aInfo;
- TInt r = DoControl( EMemSpyDriverOpCodeHeapInfoGetKernel, ¶ms, NULL );
+ //
+ TInt r = DoControl( EMemSpyDriverOpCodeHeapKernelDataGetInfo, ¶ms, NULL );
//
if ( r == KErrNone )
{
@@ -606,22 +612,57 @@
return r;
}
+EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoKernel(TMemSpyHeapInfo& aInfo,
+ RArray< TMemSpyDriverFreeCell >& aFreeCells)
+ {
+ return GetHeapInfoKernel(aInfo, aFreeCells, EFalse, EFalse);
+ }
-EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoKernel( TMemSpyHeapInfo& aInfo, RArray< TMemSpyDriverFreeCell >& aFreeCells )
+EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoKernel(TMemSpyHeapInfo& aInfo,
+ RArray<TMemSpyDriverCell>& aCells,
+ TBool aCollectAllocatedCellsAsWellAsFree)
+ {
+ return GetHeapInfoKernel(aInfo, aCells, aCollectAllocatedCellsAsWellAsFree, EFalse);
+ }
+
+EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoKernel(TMemSpyHeapInfo& aInfo,
+ RArray<TMemSpyDriverCell>& aCells,
+ TBool aCollectAllocatedCellsAsWellAsFree,
+ TBool aUseKernelCopy)
{
TMemSpyDriverInternalHeapRequestParameters params;
- params.iTid = KMemSpyDriverGetKernelHeapDataPseudoThreadId;
+ //
+ params.iTid = KMemSpyDriverGetKernelHeapDataPseudoThreadId;
params.iRHeapVTable = NULL;
params.iMasterInfo = &aInfo;
+ params.iBuildFreeCellList = ETrue;
+ params.iBuildAllocCellList = aCollectAllocatedCellsAsWellAsFree;
+ params.iUseKernelHeapCopy = aUseKernelCopy;
//
- aFreeCells.Reset();
+ aCells.Reset();
ResetStreamBuffer();
- TInt r = DoControl( EMemSpyDriverOpCodeHeapInfoGetKernel, ¶ms, (TAny*) &iBuffer );
+ TInt r = DoControl( EMemSpyDriverOpCodeHeapKernelDataGetInfo, ¶ms );
//
- if ( r == KErrNone )
+ if ( r >= KErrNone )
{
PrintHeapInfo( aInfo );
- TRAP( r, ReadHeapInfoFreeCellsFromXferBufferL( aFreeCells ) );
+
+ // Resize transfer buffer to make room for free cells. We only make the buffer
+ // bigger, not smaller.
+ if ( iBuffer.Size() < r )
+ {
+ r = iBuffer.ReAlloc( r );
+ }
+
+ // Now fetch the heap data
+ if ( r == KErrNone )
+ {
+ r = DoControl( EMemSpyDriverOpCodeHeapKernelDataFetchCellList, &iBuffer );
+ if ( r == KErrNone )
+ {
+ TRAP( r, ReadHeapInfoFreeCellsFromXferBufferL( aCells ) );
+ }
+ }
}
else if ( r == KErrNotSupported )
{
@@ -631,12 +672,12 @@
//
return r;
}
-
+
EXPORT_C TBool RMemSpyDriverClient::IsDebugKernel()
{
TBool isDebugKernel = EFalse;
- DoControl( EMemSpyDriverOpCodeHeapInfoGetIsDebugKernel, (TAny*) &isDebugKernel );
+ DoControl( EMemSpyDriverOpCodeHeapKernelDataGetIsDebugKernel, (TAny*) &isDebugKernel );
return isDebugKernel;
}
@@ -661,7 +702,11 @@
-EXPORT_C TInt RMemSpyDriverClient::GetHeapData( TUint aTid, TUint32 aFreeCellChecksum, TDes8& aDest, TUint& aReadAddress, TUint& aAmountRemaining )
+EXPORT_C TInt RMemSpyDriverClient::GetHeapData(TUint aTid,
+ TUint32 aFreeCellChecksum,
+ TDes8& aDest,
+ TUint& aReadAddress,
+ TUint& aAmountRemaining )
{
TMemSpyDriverInternalHeapDataParams params;
params.iTid = aTid;
@@ -673,7 +718,7 @@
params.iReadAddress = 0;
aDest.Zero();
//
- TInt r = DoControl( EMemSpyDriverOpCodeHeapDataGetUser, ¶ms, NULL );
+ TInt r = DoControl( EMemSpyDriverOpCodeHeapUserDataGetFull, ¶ms, NULL );
//
if ( r >= KErrNone )
{
@@ -687,7 +732,10 @@
}
-EXPORT_C TInt RMemSpyDriverClient::GetHeapDataNext( TUint aTid, TDes8& aDest, TUint& aReadAddress, TUint& aAmountRemaining )
+EXPORT_C TInt RMemSpyDriverClient::GetHeapDataNext(TUint aTid,
+ TDes8& aDest,
+ TUint& aReadAddress,
+ TUint& aAmountRemaining)
{
TMemSpyDriverInternalHeapDataParams params;
params.iTid = aTid;
@@ -699,7 +747,7 @@
params.iReadAddress = aReadAddress;
aDest.Zero();
//
- TInt r = DoControl( EMemSpyDriverOpCodeHeapDataGetUser, ¶ms, NULL );
+ TInt r = DoControl( EMemSpyDriverOpCodeHeapUserDataGetFull, ¶ms, NULL );
//
if ( r >= KErrNone )
{
@@ -713,44 +761,71 @@
}
-
-EXPORT_C HBufC8* RMemSpyDriverClient::GetHeapDataKernelLC( TMemSpyHeapInfo& aInfo, RArray<TMemSpyDriverFreeCell>& aFreeCells )
+EXPORT_C TInt RMemSpyDriverClient::CopyHeapDataKernel()
{
- HBufC8* data = NULL;
+ return DoControl( EMemSpyDriverOpCodeHeapKernelDataCopyHeap, NULL, NULL );
+ }
- // Going to fetch free cells via stream buffer...
- ResetStreamBuffer();
+EXPORT_C TInt RMemSpyDriverClient::FreeHeapDataKernel()
+ {
+ return DoControl( EMemSpyDriverOpCodeHeapKernelDataFreeHeapCopy, NULL, NULL );
+ }
- // First pass is to preallocate buffer for kernel heap, and fetch metadata and free cells
- TInt sizeOrError = DoControl( EMemSpyDriverOpCodeHeapDataGetKernelInit, (TAny*) &aInfo, (TAny*) &iBuffer );
- if ( sizeOrError >= KErrNone )
- {
- const TInt kernelHeapSize = sizeOrError;
- if ( aInfo.Type() != TMemSpyHeapInfo::ETypeRHeap )
- {
- User::Leave( KErrNotSupported );
- }
- else
- {
- // Extract free cells
- ReadHeapInfoFreeCellsFromXferBufferL( aFreeCells );
-
- // It's okay to treat the heap info as an RHeap
- PrintHeapInfo( aInfo );
-
- // Allocate data sink and do fetch
- data = HBufC8::NewLC( kernelHeapSize );
- TPtr8 pBuffer( data->Des() );
-
- sizeOrError = DoControl( EMemSpyDriverOpCodeHeapDataGetKernelFetch, &pBuffer, NULL );
- }
+EXPORT_C TInt RMemSpyDriverClient::GetHeapDataKernel(TUint aTid,
+ TDes8& aDest,
+ TUint& aReadAddress,
+ TUint& aAmountRemaining)
+ {
+ TMemSpyDriverInternalHeapDataParams params;
+ params.iTid = aTid;
+ params.iRHeapVTable = RHeapVTable();
+ params.iDebugAllocator = DebugEUser();
+ params.iDes = &aDest;
+ params.iChecksum = 0;
+ params.iRemaining = -1;
+ params.iReadAddress = 0;
+ aDest.Zero();
+ //
+ TInt r = DoControl( EMemSpyDriverOpCodeHeapKernelDataGetFull, ¶ms, NULL );
+ //
+ if ( r >= KErrNone )
+ {
+ aDest.SetLength( r );
+ aReadAddress = params.iReadAddress;
+ aAmountRemaining = params.iRemaining;
+ r = KErrNone;
}
-
- User::LeaveIfError( sizeOrError );
- return data;
+ return r;
}
+EXPORT_C TInt RMemSpyDriverClient::GetHeapDataKernelNext(TUint aTid,
+ TDes8& aDest,
+ TUint& aReadAddress,
+ TUint& aAmountRemaining)
+ {
+ TMemSpyDriverInternalHeapDataParams params;
+ params.iTid = aTid;
+ params.iRHeapVTable = RHeapVTable();
+ params.iDebugAllocator = DebugEUser();
+ params.iDes = &aDest;
+ params.iChecksum = 0;
+ params.iRemaining = aAmountRemaining;
+ params.iReadAddress = aReadAddress;
+ aDest.Zero();
+ //
+ TInt r = DoControl( EMemSpyDriverOpCodeHeapKernelDataGetFull, ¶ms, NULL );
+ //
+ if ( r >= KErrNone )
+ {
+ aDest.SetLength( r );
+ aReadAddress = params.iReadAddress;
+ aAmountRemaining = params.iRemaining;
+ r = KErrNone;
+ }
+ //
+ return r;
+ }
@@ -792,12 +867,19 @@
params.iRHeapVTable = RHeapVTable();
params.iDebugAllocator = DebugEUser();
//
- const TInt r = DoControl( EMemSpyDriverOpCodeWalkHeapInit, ¶ms, NULL );
+ const TInt r = DoControl( EMemSpyDriverOpCodeHeapUserWalkInit, ¶ms, NULL );
return r;
}
-EXPORT_C TInt RMemSpyDriverClient::WalkHeapNextCell( TUint aTid, TMemSpyDriverCellType& aCellType, TAny*& aCellAddress, TInt& aLength, TInt& aNestingLevel, TInt& aAllocNumber, TInt& aCellHeaderSize, TAny*& aCellPayloadAddress )
+EXPORT_C TInt RMemSpyDriverClient::WalkHeapNextCell(TUint aTid,
+ TMemSpyDriverCellType& aCellType,
+ TAny*& aCellAddress,
+ TInt& aLength,
+ TInt& aNestingLevel,
+ TInt& aAllocNumber,
+ TInt& aCellHeaderSize,
+ TAny*& aCellPayloadAddress)
{
aCellType = EMemSpyDriverBadCellMask;
aCellAddress = NULL;
@@ -808,7 +890,7 @@
aCellPayloadAddress = NULL;
//
TMemSpyDriverInternalWalkHeapParamsCell params;
- const TInt r = DoControl( EMemSpyDriverOpCodeWalkHeapNextCell, (TAny*) aTid, ¶ms );
+ const TInt r = DoControl( EMemSpyDriverOpCodeHeapUserWalkNextCell, (TAny*) aTid, ¶ms );
//
if ( r == KErrNone )
{
@@ -832,7 +914,7 @@
params.iDes = &aDest;
aDest.Zero();
//
- TInt r = DoControl( EMemSpyDriverOpCodeWalkHeapReadCellData, ¶ms, NULL );
+ TInt r = DoControl( EMemSpyDriverOpCodeHeapUserWalkReadCellData, ¶ms, NULL );
if ( r >= KErrNone )
{
aDest.SetLength( r );
@@ -843,7 +925,13 @@
}
-EXPORT_C TInt RMemSpyDriverClient::WalkHeapGetCellInfo( TAny*& aCellAddress, TMemSpyDriverCellType& aCellType, TInt& aLength, TInt& aNestingLevel, TInt& aAllocNumber, TInt& aCellHeaderSize, TAny*& aCellPayloadAddress )
+EXPORT_C TInt RMemSpyDriverClient::WalkHeapGetCellInfo(TAny*& aCellAddress,
+ TMemSpyDriverCellType& aCellType,
+ TInt& aLength,
+ TInt& aNestingLevel,
+ TInt& aAllocNumber,
+ TInt& aCellHeaderSize,
+ TAny*& aCellPayloadAddress)
{
aCellType = EMemSpyDriverBadCellMask;
aLength = 0;
@@ -853,7 +941,7 @@
aCellPayloadAddress = NULL;
//
TMemSpyDriverInternalWalkHeapParamsCell params;
- const TInt r = DoControl( EMemSpyDriverOpCodeWalkHeapGetCellInfo, aCellAddress, ¶ms );
+ const TInt r = DoControl( EMemSpyDriverOpCodeHeapUserWalkGetCellInfo, aCellAddress, ¶ms );
//
if ( r == KErrNone )
{
@@ -871,7 +959,7 @@
EXPORT_C void RMemSpyDriverClient::WalkHeapClose()
{
- DoControl( EMemSpyDriverOpCodeWalkHeapClose, NULL, NULL );
+ DoControl( EMemSpyDriverOpCodeHeapUserWalkClose, NULL, NULL );
}
@@ -920,7 +1008,11 @@
}
-EXPORT_C TInt RMemSpyDriverClient::GetStackData( TUint aTid, TDes8& aDest, TUint& aAmountRemaining, TMemSpyDriverDomainType aDomain, TBool aEntireStack )
+EXPORT_C TInt RMemSpyDriverClient::GetStackData(TUint aTid,
+ TDes8& aDest,
+ TUint& aAmountRemaining,
+ TMemSpyDriverDomainType aDomain,
+ TBool aEntireStack)
{
TMemSpyDriverInternalStackDataParams params;
params.iTid = aTid;
@@ -943,7 +1035,11 @@
}
-EXPORT_C TInt RMemSpyDriverClient::GetStackDataNext( TUint aTid, TDes8& aDest, TUint& aAmountRemaining, TMemSpyDriverDomainType aDomain, TBool aEntireStack )
+EXPORT_C TInt RMemSpyDriverClient::GetStackDataNext(TUint aTid,
+ TDes8& aDest,
+ TUint& aAmountRemaining,
+ TMemSpyDriverDomainType aDomain,
+ TBool aEntireStack )
{
TMemSpyDriverInternalStackDataParams params;
params.iTid = aTid;
@@ -1096,7 +1192,9 @@
}
-EXPORT_C void RMemSpyDriverClient::ProcessInspectionRequestChanges( TUint aPid, TRequestStatus& aStatus, TMemSpyDriverProcessInspectionInfo& aInfo )
+EXPORT_C void RMemSpyDriverClient::ProcessInspectionRequestChanges(TUint aPid,
+ TRequestStatus& aStatus,
+ TMemSpyDriverProcessInspectionInfo& aInfo )
{
aInfo.iProcessId = aPid;
aStatus = KRequestPending;
@@ -1150,7 +1248,9 @@
-EXPORT_C TInt RMemSpyDriverClient::GetContainerHandles( TMemSpyDriverContainerType aContainer, TAny** aHandleArray, TInt& aHandleCount )
+EXPORT_C TInt RMemSpyDriverClient::GetContainerHandles(TMemSpyDriverContainerType aContainer,
+ TAny** aHandleArray,
+ TInt& aHandleCount)
{
TMemSpyDriverInternalContainerHandleParams params;
params.iTidOrPid = KMemSpyDriverEnumerateContainerHandles;
@@ -1166,7 +1266,10 @@
}
-EXPORT_C TInt RMemSpyDriverClient::GetThreadHandlesByType( TInt aTid, TMemSpyDriverContainerType aType, TAny** aHandleArray, TInt& aHandleCount )
+EXPORT_C TInt RMemSpyDriverClient::GetThreadHandlesByType(TInt aTid,
+ TMemSpyDriverContainerType aType,
+ TAny** aHandleArray,
+ TInt& aHandleCount)
{
TMemSpyDriverInternalContainerHandleParams params;
params.iTidOrPid = aTid;
@@ -1182,7 +1285,10 @@
}
-EXPORT_C TInt RMemSpyDriverClient::GetProcessHandlesByType( TInt aPid, TMemSpyDriverContainerType aType, TAny** aHandleArray, TInt& aHandleCount )
+EXPORT_C TInt RMemSpyDriverClient::GetProcessHandlesByType(TInt aPid,
+ TMemSpyDriverContainerType aType,
+ TAny** aHandleArray,
+ TInt& aHandleCount)
{
TMemSpyDriverInternalContainerHandleParams params;
params.iTidOrPid = aPid;
@@ -1198,7 +1304,10 @@
}
-EXPORT_C TInt RMemSpyDriverClient::GetGenericHandleInfo( TInt aTid, TMemSpyDriverContainerType aType, TAny* aHandle, TMemSpyDriverHandleInfoGeneric& aParams )
+EXPORT_C TInt RMemSpyDriverClient::GetGenericHandleInfo(TInt aTid,
+ TMemSpyDriverContainerType aType,
+ TAny* aHandle,
+ TMemSpyDriverHandleInfoGeneric& aParams)
{
aParams.iType = aType;
aParams.iHandle = aHandle;
@@ -1239,7 +1348,9 @@
}
-EXPORT_C TInt RMemSpyDriverClient::GetCondVarSuspendedThreads( TAny* aCondVarHandle, TAny** aThreadHandleArray, TInt& aThreadCount )
+EXPORT_C TInt RMemSpyDriverClient::GetCondVarSuspendedThreads(TAny* aCondVarHandle,
+ TAny** aThreadHandleArray,
+ TInt& aThreadCount)
{
TMemSpyDriverInternalCondVarSuspendedThreadParams params;
params.iCondVarHandle = aCondVarHandle;
@@ -1253,7 +1364,8 @@
}
-EXPORT_C TInt RMemSpyDriverClient::GetCondVarSuspendedThreadInfo( TAny* aHandle, TMemSpyDriverCondVarSuspendedThreadInfo& aParams )
+EXPORT_C TInt RMemSpyDriverClient::GetCondVarSuspendedThreadInfo(TAny* aHandle,
+ TMemSpyDriverCondVarSuspendedThreadInfo& aParams)
{
return DoControl( EMemSpyDriverOpCodeContainersGetCondVarSuspendedThreadInfo, aHandle, &aParams );
}
@@ -1274,7 +1386,9 @@
-EXPORT_C TInt RMemSpyDriverClient::GetServerSessionHandles( TAny* aServerHandle, TAny** aSessionHandleArray, TInt& aSessionHandleCount )
+EXPORT_C TInt RMemSpyDriverClient::GetServerSessionHandles(TAny* aServerHandle,
+ TAny** aSessionHandleArray,
+ TInt& aSessionHandleCount)
{
TMemSpyDriverInternalServerSessionHandleParams params;
params.iServerHandle = aServerHandle;
@@ -1288,7 +1402,8 @@
}
-EXPORT_C TInt RMemSpyDriverClient::GetServerSessionInfo( TAny* aSessionHandle, TMemSpyDriverServerSessionInfo& aParams )
+EXPORT_C TInt RMemSpyDriverClient::GetServerSessionInfo(TAny* aSessionHandle,
+ TMemSpyDriverServerSessionInfo& aParams)
{
return DoControl( EMemSpyDriverOpCodeClientServerGetServerSessionInfo, aSessionHandle, &aParams );
}
@@ -1452,6 +1567,10 @@
CleanupStack::PopAndDestroy( &stream );
}
+#ifdef _DEBUG
+ RDebug::Printf( "[MemSpy] RMemSpyDriverClient::ReadHeapInfoFreeCellsFromXferBufferL() - END" );
+#endif
+
ResetStreamBuffer();
}