memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapInfo.cpp
branchRCL_3
changeset 49 7fdc9a71d314
parent 44 52e343bb8f80
child 59 8ad140f3dd41
equal deleted inserted replaced
46:e26895079d7c 49:7fdc9a71d314
    44 
    44 
    45 
    45 
    46 DMemSpyDriverLogChanHeapInfo::~DMemSpyDriverLogChanHeapInfo()
    46 DMemSpyDriverLogChanHeapInfo::~DMemSpyDriverLogChanHeapInfo()
    47 	{
    47 	{
    48 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::~DMemSpyDriverLogChanHeapInfo() - START - this: 0x%08x", this ));
    48 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::~DMemSpyDriverLogChanHeapInfo() - START - this: 0x%08x", this ));
       
    49 	ReleaseCellList();
    49 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::~DMemSpyDriverLogChanHeapInfo() - END - this: 0x%08x", this ));
    50 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::~DMemSpyDriverLogChanHeapInfo() - END - this: 0x%08x", this ));
    50 	}
    51 	}
    51 
       
    52 
       
    53 
       
    54 
       
    55 
       
    56 
       
    57 
       
    58 
    52 
    59 TInt DMemSpyDriverLogChanHeapInfo::Request( TInt aFunction, TAny* a1, TAny* a2 )
    53 TInt DMemSpyDriverLogChanHeapInfo::Request( TInt aFunction, TAny* a1, TAny* a2 )
    60 	{
    54 	{
    61 	TInt r = DMemSpyDriverLogChanHeapBase::Request( aFunction, a1, a2 );
    55 	TInt r = DMemSpyDriverLogChanHeapBase::Request( aFunction, a1, a2 );
    62     if  ( r == KErrNone )
    56     if  ( r == KErrNone )
    63         {
    57         {
    64         if  ( aFunction != EMemSpyDriverOpCodeHeapInfoFetchFreeCells )
    58         if  ( aFunction != EMemSpyDriverOpCodeHeapInfoFetchCellList )
    65             {
    59             {
    66             ReleaseFreeCells();
    60             ReleaseCellList();
    67             }
    61             }
    68         //
    62         //
    69         switch( aFunction )
    63         switch( aFunction )
    70 		    {
    64 		    {
    71         case EMemSpyDriverOpCodeHeapInfoGetUser:
    65         case EMemSpyDriverOpCodeHeapInfoGetUser:
    73             break;
    67             break;
    74 	    case EMemSpyDriverOpCodeHeapInfoGetKernel:
    68 	    case EMemSpyDriverOpCodeHeapInfoGetKernel:
    75             r = GetHeapInfoKernel( (TMemSpyDriverInternalHeapRequestParameters*) a1, (TDes8*) a2 );
    69             r = GetHeapInfoKernel( (TMemSpyDriverInternalHeapRequestParameters*) a1, (TDes8*) a2 );
    76             break;
    70             break;
    77         case EMemSpyDriverOpCodeHeapInfoGetIsDebugKernel:
    71         case EMemSpyDriverOpCodeHeapInfoGetIsDebugKernel:
    78             r = GetIsDebugKernel( (TBool*) a1 );
    72             r = GetIsDebugKernel(a1);
    79             break;
    73             break;
    80         case EMemSpyDriverOpCodeHeapInfoFetchFreeCells:
    74         case EMemSpyDriverOpCodeHeapInfoFetchCellList:
    81             r = FetchFreeCells( (TDes8*) a1 );
    75             r = FetchCellList( (TDes8*) a1 );
    82             break;
    76             break;
    83 
    77 
    84         default:
    78         default:
    85             r = KErrNotSupported;
    79             r = KErrNotSupported;
    86 		    break;
    80 		    break;
   130             {
   124             {
   131             // Check that the process' thread's are suspended
   125             // Check that the process' thread's are suspended
   132             DThread* thread = (DThread*) TempObject();
   126             DThread* thread = (DThread*) TempObject();
   133             if  ( SuspensionManager().IsSuspended( *thread ) )
   127             if  ( SuspensionManager().IsSuspended( *thread ) )
   134                 {
   128                 {
   135                 TFullName chunkName;
       
   136 
       
   137                 // Open client's heap
   129                 // Open client's heap
   138                 RMemSpyDriverRHeapUser rHeap( OSAdaption() );
   130                 RMemSpyDriverRHeapUser rHeap( OSAdaption() );
   139                 DChunk* userHeapChunk = NULL;
   131 				r = rHeap.OpenUserHeap(*thread, iHeapInfoParams.iDebugAllocator);
   140                 r = OpenUserHeap( *thread, iHeapInfoParams.iRHeapVTable, rHeap, userHeapChunk, &chunkName );
       
   141                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - opening client heap returned: %d", r) );
   132                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - opening client heap returned: %d", r) );
   142 
   133 
   143                 if  ( r == KErrNone )
   134                 if  ( r == KErrNone )
   144                     {
   135                     {
   145                     // This object holds all of the info we will accumulate for the client.
   136                     // This object holds all of the info we will accumulate for the client.
   146                     TMemSpyHeapInfo masterHeapInfo;
   137                     TMemSpyHeapInfo masterHeapInfo;
   147                     masterHeapInfo.SetType( TMemSpyHeapInfo::ETypeRHeap );
   138                     masterHeapInfo.SetType(rHeap.GetTypeFromHelper());
   148                     masterHeapInfo.SetTid( iHeapInfoParams.iTid );
   139                     masterHeapInfo.SetTid( iHeapInfoParams.iTid );
   149                     masterHeapInfo.SetPid( OSAdaption().DThread().GetOwningProcessId( *thread ) );
   140                     masterHeapInfo.SetPid( OSAdaption().DThread().GetOwningProcessId( *thread ) );
   150 
   141 
   151                     // This is the RHeap-specific object that contains all RHeap info
   142                     // This is the RHeap-specific object that contains all RHeap info
   152                     TMemSpyHeapInfoRHeap& rHeapInfo = masterHeapInfo.AsRHeap();
   143                     TMemSpyHeapInfoRHeap& rHeapInfo = masterHeapInfo.AsRHeap();
   153 
   144 
   154                     // This is the object data for the RHeap instance
       
   155                     TMemSpyHeapObjectDataRHeap& rHeapObjectData = rHeapInfo.ObjectData();
       
   156                     rHeap.CopyObjectDataTo( rHeapObjectData );
       
   157 
   145 
   158                     // We must walk the client's heap in order to build statistics
   146                     // We must walk the client's heap in order to build statistics
   159                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - calling heap walker constructor..."));
   147                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - calling heap walker constructor..."));
   160                     TMemSpyHeapWalkerNullObserver observer; 
   148 					RMemSpyDriverHeapWalker heapWalker(rHeap);
   161                     RMemSpyDriverHeapWalker heapWalker( rHeap, iHeapInfoParams.iDebugAllocator );
   149                     if  (iHeapInfoParams.iBuildFreeCellList || iHeapInfoParams.iBuildAllocCellList)
   162                     if  ( iHeapInfoParams.iBuildFreeCellList )
       
   163                         {
   150                         {
   164                         heapWalker.SetObserver( this );
   151                         heapWalker.SetObserver( this );
   165                         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - collecting free cells"));
   152                         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - collecting cells"));
   166                         }
   153                         }
   167                     else
   154                     else
   168                         {
   155                         {
   169                         heapWalker.SetObserver( &observer );
   156                         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - not collecting cells"));
   170                         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - not collecting free cells"));
       
   171                         }
   157                         }
   172 
   158 
   173                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - starting traversal..." ));
   159                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - starting traversal openerr: %d...", r));
   174 
   160 
   175 #if ( defined( TRACE_TYPE_USERHEAP ) && defined( TRACE_TYPE_HEAPWALK ) )
   161 #if ( defined( TRACE_TYPE_USERHEAP ) && defined( TRACE_TYPE_HEAPWALK ) )
   176                     heapWalker.SetPrintDebug();
   162                     heapWalker.SetPrintDebug();
   177 #endif
   163 #endif
   178                     r = heapWalker.Traverse();
   164                     if (r == KErrNone) r = heapWalker.Traverse();
   179                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - finished traversal - err: %d", r ));
   165                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - finished traversal - err: %d", r ));
   180 
   166 
   181                     TMemSpyHeapStatisticsRHeap& rHeapStats = rHeapInfo.Statistics();
   167                     TMemSpyHeapStatisticsRHeap& rHeapStats = rHeapInfo.Statistics();
   182                     heapWalker.CopyStatsTo( rHeapStats );
   168                     heapWalker.CopyStatsTo( rHeapStats );
   183 
   169 
   184                     // Get remaining meta data that isn't stored elsewhere
   170                     // Get remaining meta data that isn't stored elsewhere
   185                     TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
   171                     TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
   186                     rHeapMetaData.SetChunkName( chunkName );
   172 					DChunk& userHeapChunk = rHeap.Chunk();
   187                     rHeapMetaData.SetChunkSize( (TUint) OSAdaption().DChunk().GetSize( *userHeapChunk ) );
   173 					TFullName chunkName;
   188                     rHeapMetaData.SetChunkHandle( userHeapChunk );
   174 					userHeapChunk.FullName(chunkName);
   189                     rHeapMetaData.SetChunkBaseAddress( OSAdaption().DChunk().GetBase( *userHeapChunk ) );
   175 					rHeapMetaData.SetChunkName( chunkName );
   190                     rHeapMetaData.SetDebugAllocator( iHeapInfoParams.iDebugAllocator );
   176 		            rHeapMetaData.SetChunkSize( (TUint) OSAdaption().DChunk().GetSize( userHeapChunk ) );
   191                     rHeapMetaData.SetHeaderSizeFree( RMemSpyDriverRHeapBase::FreeCellHeaderSize() );
   177 					rHeapMetaData.SetChunkHandle( &userHeapChunk );
   192                     rHeapMetaData.SetHeaderSizeAllocated( RMemSpyDriverRHeapBase::AllocatedCellHeaderSize( iHeapInfoParams.iDebugAllocator ) );
   178 					rHeapMetaData.SetChunkBaseAddress( OSAdaption().DChunk().GetBase( userHeapChunk ) );
       
   179                     rHeapMetaData.SetDebugAllocator(rHeap.Helper()->AllocatorIsUdeb());
   193                     rHeapMetaData.SetUserThread( ETrue );
   180                     rHeapMetaData.SetUserThread( ETrue );
   194 
   181 					rHeapMetaData.iHeapSize = rHeap.Helper()->CommittedSize();
   195                     // Get any heap-specific info
   182 					rHeapMetaData.iAllocatorAddress = (TAny*)rHeap.Helper()->AllocatorAddress();
   196                     rHeap.GetHeapSpecificInfo( masterHeapInfo );
   183 					rHeapMetaData.iMinHeapSize = rHeap.Helper()->MinCommittedSize();
       
   184 					rHeapMetaData.iMaxHeapSize = rHeap.Helper()->MaxCommittedSize();
   197 
   185 
   198                     PrintHeapInfo( masterHeapInfo );
   186                     PrintHeapInfo( masterHeapInfo );
   199 
   187 
   200                     // Write free cells if requested
   188                     // Write free cells if requested
   201                     if  ( r == KErrNone && iHeapInfoParams.iBuildFreeCellList )
   189                     if  ( r == KErrNone && (iHeapInfoParams.iBuildFreeCellList || iHeapInfoParams.iBuildAllocCellList))
   202                         {
   190                         {
   203                         r = PrepareFreeCellTransferBuffer();
   191                         r = PrepareCellListTransferBuffer();
   204                         }
   192                         }
   205 
   193 
   206                     // Update info ready for writing back to the user-side
   194                     // Update info ready for writing back to the user-side
   207                     if  ( r >= KErrNone )
   195                     if  ( r >= KErrNone )
   208                         {
   196                         {
   215                             r = error;
   203                             r = error;
   216                             }
   204                             }
   217                         }
   205                         }
   218 
   206 
   219                     // Release resources
   207                     // Release resources
   220                     rHeap.DisassociateWithKernelChunk();
   208 					rHeap.Close();
   221                     }
   209                     }
   222                 }
   210                 }
   223             else
   211             else
   224                 {
   212                 {
   225                 r = KErrAccessDenied;
   213                 r = KErrAccessDenied;
   247     TMemSpyDriverInternalHeapRequestParameters params;
   235     TMemSpyDriverInternalHeapRequestParameters params;
   248     TInt r = Kern::ThreadRawRead( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverInternalHeapRequestParameters) );
   236     TInt r = Kern::ThreadRawRead( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverInternalHeapRequestParameters) );
   249     if  ( r == KErrNone )
   237     if  ( r == KErrNone )
   250         {
   238         {
   251         // Open kernel heap
   239         // Open kernel heap
   252         TFullName heapChunkName;
       
   253         RMemSpyDriverRHeapKernelInPlace rHeap;
   240         RMemSpyDriverRHeapKernelInPlace rHeap;
   254         r = OpenKernelHeap( rHeap, &heapChunkName );
   241         r = rHeap.OpenKernelHeap();
   255         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - open err: %d", r ) );
   242         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - open err: %d", r ) );
   256 
   243 
   257         if  ( r == KErrNone )
   244         if  ( r == KErrNone )
   258             {
   245             {
   259             // We must identify if we have a debug kernel allocator
   246             r = DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel(rHeap, params.iMasterInfo, aTransferBuffer);
   260             const TBool debugAllocator = IsDebugKernel( rHeap );
       
   261             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - debugAllocator: %d", debugAllocator ) );
       
   262 
       
   263             r = DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel( rHeap, debugAllocator, heapChunkName, params.iMasterInfo, aTransferBuffer );
       
   264             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - base class get heap info: %d", r) );
   247             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - base class get heap info: %d", r) );
   265             }
   248             }
       
   249         else 
       
   250             {
       
   251             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - open err: %d", r ) );
       
   252             }
   266         }
   253         }
   267     else
   254     else
   268         {
   255         {
   269     	Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - params read error: %d", r);
   256         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - params read error: %d", r) );
   270         }
   257         }
   271 
   258 
   272 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - END - ret: %d", r) );
   259 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - END - ret: %d", r) );
   273     return r;
   260     return r;
   274     }
   261     }
   276 
   263 
   277 
   264 
   278 
   265 
   279 
   266 
   280 
   267 
   281 TInt DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel( TBool* aIsDebugKernel )
   268 TInt DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel(TAny* aResult)
   282     {
   269     {
   283     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - START") );
   270     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - START") );
   284     
   271     
   285     TInt r = KErrNone;
   272     TInt r = KErrNone;
   286     TBool debugKernel = EFalse;
   273     TBool debugKernel = EFalse;
   287 
   274 
   288     NKern::ThreadEnterCS();
   275     NKern::ThreadEnterCS();
   289     
   276     
   290     RMemSpyDriverRHeapKernelInPlace rHeap;
   277     RMemSpyDriverRHeapKernelInPlace rHeap;
   291     r = OpenKernelHeap( rHeap );
   278     r = rHeap.OpenKernelHeap();
   292     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - open kernel heap returned: %d", r) );
   279     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - open kernel heap returned: %d", r) );
   293 
   280 
   294     if  ( r == KErrNone )
   281     if  ( r == KErrNone )
   295         {
   282         {
   296         debugKernel = IsDebugKernel( rHeap );
   283         debugKernel = rHeap.Helper()->AllocatorIsUdeb();
   297 
   284 
   298         // Tidy up
   285         // Tidy up
   299         rHeap.DisassociateWithKernelChunk();
   286         rHeap.Close();
   300         }
   287         }
   301 
   288 
   302     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - debugKernel: %d", debugKernel) );
   289     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - debugKernel: %d", debugKernel) );
   303 
   290 
   304     // Write back to user-land
   291     // Write back to user-land
   305     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - writing to user-side...") );
   292     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - writing to user-side...") );
   306     r = Kern::ThreadRawWrite( &ClientThread(), aIsDebugKernel, &debugKernel, sizeof(TBool) );
   293     r = Kern::ThreadRawWrite( &ClientThread(), aResult, &debugKernel, sizeof(TBool) );
   307 
   294 
   308     NKern::ThreadLeaveCS();
   295     NKern::ThreadLeaveCS();
   309 
   296 
   310  	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - END - ret: %d", r) );
   297  	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - END - ret: %d", r) );
   311     return r;
   298     return r;
   312     }
   299     }
   313 
   300 
   314 
   301 TInt DMemSpyDriverLogChanHeapInfo::PrepareCellListTransferBuffer()
   315 
   302     {
   316 
   303     // Transfer free cells immediately from xfer stream
   317 
   304     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::PrepareCellListTransferBuffer() - START - iHeapStream: 0x%08x", iHeapStream ));
   318 
   305     __ASSERT_ALWAYS( !iHeapStream, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapFreeCellStreamNotClosed ) );
   319 
   306     //
   320 
   307     TInt r = KErrNoMemory;
   321 
   308     //
   322 
   309     NKern::ThreadEnterCS();
   323 
   310     //
   324 
   311     iHeapStream = new RMemSpyMemStreamWriter();
   325 
   312     if  ( iHeapStream )
   326 
   313         {
   327 
   314         const TInt requiredMemory = CalculateCellListBufferSize();
   328 
   315         r = OpenXferStream( *iHeapStream, requiredMemory );
   329 
   316         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::PrepareCellListTransferBuffer() - requested %d bytes for free cell list, r: %d", requiredMemory, r ));
   330 
   317 
   331 
   318         if  ( r == KErrNone )
   332 
   319             {
   333 
   320             const TInt count = iCellList.Count();
   334 
   321             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::PrepareCellListTransferBuffer() - cell count: %d", count ));
   335 
   322             //
   336 
   323             iHeapStream->WriteInt32( count );
   337 
   324             for( TInt i=0; i<count; i++ )
   338 
   325                 {
   339 
   326                 const TMemSpyDriverCell& cell = iCellList[ i ];
   340 
   327                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::PrepareCellListTransferBuffer() - storing entry: %d", i ));
   341 
   328                 //
   342 
   329                 iHeapStream->WriteInt32( cell.iType );
   343 
   330                 iHeapStream->WriteUint32( reinterpret_cast<TUint32>( cell.iAddress ) );
   344 
   331                 iHeapStream->WriteInt32( cell.iLength );
   345 
   332                 }
   346 
   333 
   347 
   334             // Finished with the array now
   348 
   335             iCellList.Reset();
   349 
   336 
       
   337             // We return the amount of client-side memory that needs to be allocated to hold the buffer
       
   338             r = requiredMemory;
       
   339             }
       
   340         }
       
   341     //
       
   342     NKern::ThreadLeaveCS();
       
   343                
       
   344     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::PrepareCellListTransferBuffer() - END - r: %d", r));
       
   345 	return r;
       
   346     }
       
   347 
       
   348 
       
   349 TInt DMemSpyDriverLogChanHeapInfo::FetchCellList( TDes8* aBufferSink )
       
   350     {
       
   351     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::FetchCellList() - START - iHeapStream: 0x%08x", iHeapStream ));
       
   352     __ASSERT_ALWAYS( iHeapStream, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapFreeCellStreamNotOpen ) );
       
   353 
       
   354     TInt r = KErrNone;
       
   355 
       
   356     // Write buffer to client
       
   357     NKern::ThreadEnterCS();
       
   358     r = iHeapStream->WriteAndClose( aBufferSink );
       
   359 
       
   360     // Tidy up
       
   361     ReleaseCellList();
       
   362 
       
   363     NKern::ThreadLeaveCS();
       
   364     //
       
   365     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::FetchCellList() - END - r: %d", r));
       
   366 	return r;
       
   367     }
       
   368 
       
   369 
       
   370 
       
   371 TInt DMemSpyDriverLogChanHeapInfo::CalculateCellListBufferSize() const
       
   372     {
       
   373     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::CalculateCellListBufferSize() - START" ));
       
   374 
       
   375     const TInt count = iCellList.Count();
       
   376     const TInt entrySize = sizeof( TInt32 ) + sizeof( TInt32 ) + sizeof( TUint32 );
       
   377     const TInt r = ( count * entrySize ) + sizeof( TInt ); // Extra TInt to hold count
       
   378                 
       
   379     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::CalculateCellListBufferSize() - END - r: %d, count: %d, entrySize: %d", r, count, entrySize ));
       
   380 	return r;
       
   381     }
       
   382 
       
   383 
       
   384 
       
   385 void DMemSpyDriverLogChanHeapInfo::ReleaseCellList()
       
   386     {
       
   387 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::ReleaseCellList() - START - this: 0x%08x", this ));
       
   388 
       
   389     NKern::ThreadEnterCS();
       
   390     iCellList.Reset();
       
   391     delete iHeapStream;
       
   392     iHeapStream = NULL;
       
   393     NKern::ThreadLeaveCS();
       
   394 
       
   395     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::ReleaseCellList() - END - this: 0x%08x", this ));
       
   396     }
       
   397 
       
   398 TBool DMemSpyDriverLogChanHeapInfo::HandleHeapCell(TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt /*aNestingLevel*/, TInt /*aAllocNumber*/)
       
   399     {
       
   400 	TInt err = KErrNone;
       
   401     if (((aCellType & EMemSpyDriverFreeCellMask) && iHeapInfoParams.iBuildFreeCellList) || 
       
   402         ((aCellType & EMemSpyDriverAllocatedCellMask) && iHeapInfoParams.iBuildAllocCellList))
       
   403 		{
       
   404 		TMemSpyDriverCell cell;
       
   405 		cell.iType = aCellType;
       
   406 		cell.iAddress = aCellAddress;
       
   407 		cell.iLength = aLength;
       
   408 
       
   409 		NKern::ThreadEnterCS();
       
   410 		err = iCellList.Append(cell);
       
   411 		NKern::ThreadLeaveCS();
       
   412 		}
       
   413 	return err == KErrNone;
       
   414 	}
       
   415 
       
   416 void DMemSpyDriverLogChanHeapInfo::HandleHeapWalkInit()
       
   417 	{
       
   418 	}