diff -r 516af714ebb4 -r f2950aff7424 perfsrv/memspy/Driver/User/Source/MemSpyDriverClient.cpp --- a/perfsrv/memspy/Driver/User/Source/MemSpyDriverClient.cpp Fri Sep 17 08:38:31 2010 +0300 +++ b/perfsrv/memspy/Driver/User/Source/MemSpyDriverClient.cpp Mon Oct 04 02:45:59 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& aCells, TBool aCollectAllocatedCellsAsWellAsFree) +EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoUser(TMemSpyHeapInfo& aInfo, + TUint aTid, + RArray& 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& aCells, + TBool aCollectAllocatedCellsAsWellAsFree) + { + return GetHeapInfoKernel(aInfo, aCells, aCollectAllocatedCellsAsWellAsFree, EFalse); + } + +EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoKernel(TMemSpyHeapInfo& aInfo, + RArray& 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& 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(); }