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