memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapBase.cpp
branchRCL_3
changeset 59 8ad140f3dd41
parent 49 7fdc9a71d314
equal deleted inserted replaced
49:7fdc9a71d314 59:8ad140f3dd41
    45     }
    45     }
    46 
    46 
    47 
    47 
    48 DMemSpyDriverLogChanHeapBase::~DMemSpyDriverLogChanHeapBase()
    48 DMemSpyDriverLogChanHeapBase::~DMemSpyDriverLogChanHeapBase()
    49 	{
    49 	{
       
    50 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::~DMemSpyDriverLogChanHeapBase() - START - this: 0x%08x", this ));
       
    51 
       
    52     ReleaseFreeCells();
       
    53 
       
    54 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::~DMemSpyDriverLogChanHeapBase() - END - this: 0x%08x", this ));
    50 	}
    55 	}
    51 
    56 
    52 
    57 
    53 TInt DMemSpyDriverLogChanHeapBase::Construct()
    58 TInt DMemSpyDriverLogChanHeapBase::Construct()
    54 	{
    59 	{
   166 
   171 
   167 
   172 
   168 
   173 
   169 
   174 
   170 
   175 
       
   176 TInt DMemSpyDriverLogChanHeapBase::OpenUserHeap( DThread& aClientThread, TUint aExpectedHeapVTable, RMemSpyDriverRHeapUser& aHeap, DChunk*& aUserHeapChunk, TDes8* aClientHeapChunkName )
       
   177     {
       
   178     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap() - START - aHeap.ChunkIsInitialised: %d, aExpectedHeapVTable: 0x%08x, aClientThread: %O", aHeap.ChunkIsInitialised(), aExpectedHeapVTable, &aClientThread ));
       
   179     __ASSERT_ALWAYS( aHeap.ChunkIsInitialised() == EFalse, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapChunkAlreadyCloned ) );
       
   180 
       
   181     TInt r = KErrNotFound;
       
   182     aUserHeapChunk = NULL;
       
   183     
       
   184     NKern::ThreadEnterCS();
       
   185 
       
   186     const TBool allocatorIsReallyRHeap = GetUserHeapHandle( aClientThread, aHeap, aExpectedHeapVTable );
       
   187 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - allocatorIsReallyRHeap: %d", allocatorIsReallyRHeap));
       
   188 
       
   189     if  ( allocatorIsReallyRHeap )
       
   190         {
       
   191         RAllocator* allocator = OSAdaption().DThread().GetAllocator( aClientThread );
       
   192 
       
   193         // Open client's heap chunk in order to read it's dimensions
       
   194         const TInt clientsHeapChunkHandle = aHeap.iChunkHandle;
       
   195 	    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - clientsHeapChunkHandle: 0x%08x, allocatorAddress: 0x%08x", clientsHeapChunkHandle, allocator));
       
   196 
       
   197  	    NKern::LockSystem();
       
   198         DChunk* clientsHeapChunk = (DChunk*) Kern::ObjectFromHandle( &aClientThread, clientsHeapChunkHandle, EChunk );
       
   199         NKern::UnlockSystem();
       
   200 	    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - clientsHeapChunk: 0x%08x", clientsHeapChunk ));
       
   201        
       
   202         if  ( clientsHeapChunk != NULL )
       
   203             {
       
   204             // Get the chunk name (if the caller asked for it)
       
   205             if  ( aClientHeapChunkName )
       
   206                 {
       
   207                 clientsHeapChunk->FullName( *aClientHeapChunkName );
       
   208                 }
       
   209                 
       
   210             // Update the heap chunk pointer. We do this now because this
       
   211             // should point to the _real_ user-side heap chunk, rather than
       
   212             // the copy of the chunk that we are about to make.
       
   213             aUserHeapChunk = clientsHeapChunk;
       
   214 
       
   215             // Set up ourselves to duplicate their heap chunk
       
   216             const TInt clientsHeapChunkSize = OSAdaption().DChunk().GetSize( *clientsHeapChunk );
       
   217 	        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - chunkBase: 0x%08x, size: %8d, maxLen: %8d, chunk: %O", clientsHeapChunk->iBase, clientsHeapChunkSize, clientsHeapChunk->iMaxSize, clientsHeapChunk ));
       
   218 
       
   219             // Make a new chunk that is the same size, owned by this thread.
       
   220             TChunkCreateInfo info;
       
   221             info.iType         = TChunkCreateInfo::ESharedKernelSingle;
       
   222             info.iMaxSize      = clientsHeapChunkSize;
       
   223             info.iOwnsMemory   = ETrue; // Use memory from system's free pool
       
   224             info.iDestroyedDfc = NULL;
       
   225         #ifdef __EPOC32__
       
   226             info.iMapAttr      = (TInt)EMapAttrFullyBlocking; // Full caching
       
   227         #endif
       
   228 
       
   229             // Holds a copy of the client's heap chunk
       
   230             DChunk* heapCopyChunk;
       
   231             TLinAddr heapCopyChunkAddress;
       
   232             TUint32 heapCopyChunkMappingAttributes;
       
   233             r = Kern::ChunkCreate( info, heapCopyChunk, heapCopyChunkAddress, heapCopyChunkMappingAttributes );
       
   234 	        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - creating chunk returned: %d", r));
       
   235             //
       
   236             if  ( r == KErrNone )
       
   237                 {
       
   238 	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - copy chunk base: 0x%08x, heapCopyChunkAddress: 0x%08x", heapCopyChunk->iBase, heapCopyChunkAddress));
       
   239                 
       
   240                 // Commit memory for entire buffer
       
   241                 TUint32 physicalAddress = 0;
       
   242                 r = Kern::ChunkCommitContiguous( heapCopyChunk, 0, clientsHeapChunkSize, physicalAddress );
       
   243 	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - commiting chunk returned: %d", r));
       
   244 
       
   245                 if  ( r != KErrNone)
       
   246                     {
       
   247                     // On error, thow away the chunk we have created
       
   248                     Kern::ChunkClose( heapCopyChunk );
       
   249                     heapCopyChunk = NULL;
       
   250                     }
       
   251                 else
       
   252                     {
       
   253     	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - heapCopyChunk->iSize: 0x%08x, heapCopyChunk->iBase: 0x%08x, heapCopyChunkAddress: 0x%08x, physicalAddress: 0x%08x", heapCopyChunk->iSize, heapCopyChunk->iBase, heapCopyChunkAddress, physicalAddress));
       
   254     
       
   255                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - trying to copy %d bytes from clients allocator address of 0x%08x", clientsHeapChunkSize, allocator ));
       
   256                     r = Kern::ThreadRawRead( &aClientThread, allocator, (TAny*) heapCopyChunkAddress, clientsHeapChunkSize );
       
   257 
       
   258                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - read result of clients heap data is: %d", r));
       
   259                     if  ( r == KErrNone )
       
   260                         {
       
   261                         // Transfer ownership of the copy heap chunk to the heap object. This also calculates the delta
       
   262                         // beween the heap addresses in the client's address space and the kernel address space.
       
   263                         aHeap.AssociateWithKernelChunk( heapCopyChunk, heapCopyChunkAddress, heapCopyChunkMappingAttributes );
       
   264                         }
       
   265                     }
       
   266                 }
       
   267             }
       
   268         else
       
   269             {
       
   270 	        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - could not open clients heap chunk by its handle" ) );
       
   271             r = KErrNotFound;
       
   272             }
       
   273         }
       
   274     else
       
   275         {
       
   276 	    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - clients heap is not an RHeap (allocated vTable mismatch)" ) );
       
   277         r = KErrNotSupported;
       
   278         }
       
   279 
       
   280     NKern::ThreadLeaveCS();
       
   281 
       
   282     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - r: %d", r ));
       
   283     return r;
       
   284     }
       
   285 
       
   286 
       
   287 
       
   288 
       
   289 
       
   290 
       
   291 
       
   292 
       
   293 
       
   294 
       
   295 
       
   296 
       
   297 
       
   298 
       
   299 
       
   300 
       
   301 
       
   302 
       
   303 
       
   304 
       
   305 
       
   306 
       
   307 
       
   308 TBool DMemSpyDriverLogChanHeapBase::GetUserHeapHandle( DThread& aThread, RMemSpyDriverRHeapUser& aHeap, TUint aExpectedVTable )
       
   309     {
       
   310     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetUserHeapHandle() - START - aExpectedVTable: 0x%08x", aExpectedVTable) );
       
   311 
       
   312     RAllocator* allocator = OSAdaption().DThread().GetAllocator( aThread );
       
   313 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - allocator addr: 0x%08x", allocator) );
       
   314     TUint* pAllocator = (TUint*) allocator;
       
   315     // 
       
   316     TBool vTableOkay = EFalse;
       
   317     TUint vtable = 0;
       
   318 
       
   319     // Read a bit more data than is available for debugging purposes
       
   320     TBuf8<32> vtableBuf;
       
   321     TInt r = Kern::ThreadRawRead( &aThread, pAllocator, (TUint8*) vtableBuf.Ptr(), vtableBuf.MaxLength() );
       
   322     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - read result of vtable data from requested thread is: %d", r));
       
   323     if  ( r == KErrNone )
       
   324         {
       
   325         TRACE( MemSpyDriverUtils::DataDump("allocator vtable data - %lS", vtableBuf.Ptr(), vtableBuf.MaxLength(), vtableBuf.MaxLength() ) );
       
   326         vtableBuf.SetLength( vtableBuf.MaxLength() );
       
   327         
       
   328         vtable = vtableBuf[0] +
       
   329                 (vtableBuf[1] << 8) + 
       
   330                 (vtableBuf[2] << 16) + 
       
   331                 (vtableBuf[3] << 24);
       
   332         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - client VTable is: 0x%08x", vtable) );
       
   333 
       
   334         // Check the v-table to work out if it really is an RHeap
       
   335         vTableOkay = ( vtable == aExpectedVTable );
       
   336         if  ( vTableOkay )
       
   337             {
       
   338             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - vtables okay") );
       
   339             r = aHeap.ReadFromUserAllocator( aThread );
       
   340             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - after userget, error: %d", r));
       
   341         
       
   342             }
       
   343         else
       
   344             {
       
   345             TRACE( Kern::Printf( "DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - vtables dont match! - aExpectedVTable: 0x%08x, allocator addr: 0x%08x, client VTable is: 0x%08x, aThread: %O", aExpectedVTable, allocator, vtable, &aThread ) );
       
   346             }
       
   347         }
       
   348     else
       
   349         {
       
   350         TRACE( Kern::Printf( "DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - error during client vTable reading: %d, aThread: %O", r, &aThread ) );
       
   351         }
       
   352     //
       
   353     return (vTableOkay && (r == KErrNone));
       
   354     }
       
   355 
       
   356 
       
   357 
       
   358 
       
   359 
       
   360 
       
   361 
       
   362 
       
   363 
       
   364 
       
   365 
       
   366 
       
   367 
       
   368 
   171 void DMemSpyDriverLogChanHeapBase::PrintHeapInfo( const TMemSpyHeapInfo& aInfo )
   369 void DMemSpyDriverLogChanHeapBase::PrintHeapInfo( const TMemSpyHeapInfo& aInfo )
   172     {
   370     {
   173     const TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
   371     const TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
   174     //const TMemSpyHeapObjectDataRHeap& rHeapObjectData = rHeapInfo.ObjectData();
   372     const TMemSpyHeapObjectDataRHeap& rHeapObjectData = rHeapInfo.ObjectData();
   175     const TMemSpyHeapStatisticsRHeap& rHeapStats = rHeapInfo.Statistics();
   373     const TMemSpyHeapStatisticsRHeap& rHeapStats = rHeapInfo.Statistics();
   176     const TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
   374     const TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
       
   375 
       
   376     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
       
   377     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RAllocator                                      -" ) );
       
   378     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
       
   379     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RAllocator::iAccessCount:       %d", rHeapObjectData.iAccessCount ) );
       
   380     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RAllocator::iHandleCount:       %d", rHeapObjectData.iHandleCount ) );
       
   381     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RAllocator::iHandles:           0x%08x", rHeapObjectData.iHandles ) );
       
   382     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RAllocator::iFlags:             0x%08x", rHeapObjectData.iFlags ) );
       
   383     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RAllocator::iCellCount:         %d", rHeapObjectData.iCellCount ) );
       
   384     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RAllocator::iTotalAllocSize:    %d", rHeapObjectData.iTotalAllocSize ) );
       
   385     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - " ) );
       
   386 
       
   387     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
       
   388     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap                                           -" ) );
       
   389     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
       
   390     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iMinLength:              %d", rHeapObjectData.iMinLength ) );
       
   391     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iMaxLength:              %d", rHeapObjectData.iMaxLength ) );
       
   392     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iOffset:                 %d", rHeapObjectData.iOffset ) );
       
   393     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iGrowBy:                 %d", rHeapObjectData.iGrowBy ) );
       
   394     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iChunkHandle:            0x%08x", rHeapObjectData.iChunkHandle ) );
       
   395     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iBase:                   0x%08x", rHeapObjectData.iBase ) );
       
   396     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iTop:                    0x%08x", rHeapObjectData.iTop ) );
       
   397     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iAlign:                  %d", rHeapObjectData.iAlign ) );
       
   398     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iMinCell:                %d", rHeapObjectData.iAlign ) );
       
   399     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iPageSize:               %d", rHeapObjectData.iAlign ) );
       
   400     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iFree.next:              0x%08x", rHeapObjectData.iFree.next ) );
       
   401     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iFree.len:               %d", rHeapObjectData.iFree.len ) );
       
   402     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iNestingLevel:           %d", rHeapObjectData.iNestingLevel ) );
       
   403     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iAllocCount:             %d", rHeapObjectData.iAllocCount ) );
       
   404     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iFailType:               %d", rHeapObjectData.iFailType ) );
       
   405     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iFailRate:               %d", rHeapObjectData.iFailRate ) );
       
   406     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iFailed:                 %d", rHeapObjectData.iFailed ) );
       
   407     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iFailAllocCount:         %d", rHeapObjectData.iFailAllocCount ) );
       
   408     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iRand:                   %d", rHeapObjectData.iRand ) );
       
   409     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iTestData:               0x%08x", rHeapObjectData.iTestData ) );
       
   410     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - " ) );
   177 
   411 
   178     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
   412     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
   179     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - Stats (Free)                                    -" ) );
   413     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - Stats (Free)                                    -" ) );
   180     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
   414     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
   181     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell count:                     %d", rHeapStats.StatsFree().TypeCount() ) );
   415     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell count:                     %d", rHeapStats.StatsFree().TypeCount() ) );
   195     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell largest:                   0x%08x", rHeapStats.StatsAllocated().LargestCellAddress() ) );
   429     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell largest:                   0x%08x", rHeapStats.StatsAllocated().LargestCellAddress() ) );
   196     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell largest size:              %d", rHeapStats.StatsAllocated().LargestCellSize() ) );
   430     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell largest size:              %d", rHeapStats.StatsAllocated().LargestCellSize() ) );
   197     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - " ) );
   431     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - " ) );
   198 
   432 
   199     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
   433     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
       
   434     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - Stats (Common)                                  -" ) );
       
   435     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
       
   436     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - total cell count:               %d", rHeapStats.StatsCommon().TotalCellCount() ) );
       
   437     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - " ) );
       
   438 
       
   439     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
   200     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - Misc. Info                                      -" ) );
   440     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - Misc. Info                                      -" ) );
   201     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
   441     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
   202     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - chunk size:                     %d", rHeapMetaData.ChunkSize() ) );
   442     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - chunk size:                     %d", rHeapMetaData.ChunkSize() ) );
   203     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - chunk handle:                   0x%08x", rHeapMetaData.ChunkHandle() ) );
   443     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - chunk handle:                   0x%08x", rHeapMetaData.ChunkHandle() ) );
   204     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - chunk base address:             0x%08x", rHeapMetaData.ChunkBaseAddress() ) );
   444     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - chunk base address:             0x%08x", rHeapMetaData.ChunkBaseAddress() ) );
   205     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - debug allocator:                %d", rHeapMetaData.IsDebugAllocator() ) );
   445     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - debug allocator:                %d", rHeapMetaData.IsDebugAllocator() ) );
   206     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - shared heap:                    %d", rHeapMetaData.IsSharedHeap() ) );
   446     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - shared heap:                    %d", rHeapMetaData.IsSharedHeap() ) );
   207     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - user thread:                    %d", rHeapMetaData.IsUserThread() ) );
   447     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - user thread:                    %d", rHeapMetaData.IsUserThread() ) );
   208     //TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell header size (free):        %d", rHeapMetaData.HeaderSizeFree() ) );
   448     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell header size (free):        %d", rHeapMetaData.HeaderSizeFree() ) );
   209     //TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell header size (alloc):       %d", rHeapMetaData.HeaderSizeAllocated() ) );
   449     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell header size (alloc):       %d", rHeapMetaData.HeaderSizeAllocated() ) );
   210     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - heap vTable:                    0x%08x", rHeapMetaData.VTable() ) );
   450     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - heap vTable:                    0x%08x", rHeapMetaData.VTable() ) );
   211     //TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - heap object size:               %d", rHeapMetaData.ClassSize() ) );
   451     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - heap object size:               %d", rHeapMetaData.ClassSize() ) );
   212     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - heap size:                      %d", rHeapMetaData.iHeapSize ) );
   452     }
   213     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - allocator address:              0x%08x", rHeapMetaData.iAllocatorAddress ) );
   453 
   214     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - min heap size:                  %d", rHeapMetaData.iMinHeapSize ) );
   454 
   215     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - max heap size:                  %d", rHeapMetaData.iMaxHeapSize ) );
   455 
   216     }
   456 
   217 
   457 
   218 TInt DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel(RMemSpyDriverRHeapBase& aHeap, TMemSpyHeapInfo* aHeapInfo, TDes8* aTransferBuffer )
   458 
       
   459 
       
   460 
       
   461 
       
   462 
       
   463 TBool DMemSpyDriverLogChanHeapBase::IsDebugKernel()
       
   464     {
       
   465     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - START") );
       
   466     
       
   467     TInt r = KErrNone;
       
   468     TBool debugKernel = EFalse;
       
   469 
       
   470     NKern::ThreadEnterCS();
       
   471     RMemSpyDriverRHeapKernelInPlace rHeap;
       
   472     r = OpenKernelHeap( rHeap );
       
   473     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - open kernel heap returned: %d", r) );
       
   474 
       
   475     if  ( r == KErrNone )
       
   476         {
       
   477         debugKernel = IsDebugKernel( rHeap );
       
   478 
       
   479         // Tidy up
       
   480         rHeap.DisassociateWithKernelChunk();
       
   481         }
       
   482 
       
   483     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - debugKernel: %d", debugKernel) );
       
   484     NKern::ThreadLeaveCS();
       
   485 
       
   486  	TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - END - ret: %d", r) );
       
   487     return debugKernel;
       
   488     }
       
   489 
       
   490 
       
   491 TBool DMemSpyDriverLogChanHeapBase::IsDebugKernel( RMemSpyDriverRHeapKernelInPlace& aHeap )
       
   492     {
       
   493     TBool debugKernel = EFalse;
       
   494     //
       
   495  	TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - START") );
       
   496     NKern::ThreadEnterCS();
       
   497 
       
   498     // Request that the kernel fail the next heap allocation
       
   499     aHeap.FailNext();
       
   500 
       
   501     // Allocate a new cell, and in debug builds of the kernel, this should be NULL
       
   502     TInt* cell = new TInt();
       
   503     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - cell: 0x%08x", cell) );
       
   504     debugKernel = ( cell == NULL );
       
   505     delete cell;
       
   506 
       
   507     NKern::ThreadLeaveCS();
       
   508  	TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - END - debugKernel: %d", debugKernel) );
       
   509     //
       
   510     return debugKernel;
       
   511     }
       
   512 
       
   513 
       
   514 TInt DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel( RMemSpyDriverRHeapBase& aHeap, TBool aIsDebugAllocator, const TDesC8& aChunkName, TMemSpyHeapInfo* aHeapInfo, TDes8* aTransferBuffer )
   219     {
   515     {
   220     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel() - START - aTransferBuffer: 0x%08x", aTransferBuffer ) );
   516     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel() - START - aTransferBuffer: 0x%08x", aTransferBuffer ) );
   221 
   517 
   222     TInt r = KErrNone;
   518     TInt r = KErrNone;
   223     NKern::ThreadEnterCS();
   519     NKern::ThreadEnterCS();
   224 
   520 
   225     // This object holds all of the info we will accumulate for the client.
   521     // This object holds all of the info we will accumulate for the client.
   226     TMemSpyHeapInfo masterHeapInfo;
   522     TMemSpyHeapInfo masterHeapInfo;
   227     masterHeapInfo.SetType(aHeap.GetTypeFromHelper());
   523     masterHeapInfo.SetType( TMemSpyHeapInfo::ETypeRHeap );
   228     masterHeapInfo.SetTid( 2 );
   524     masterHeapInfo.SetTid( 2 );
   229     masterHeapInfo.SetPid( 1 );
   525     masterHeapInfo.SetPid( 1 );
   230 
   526 
   231     // This is the RHeap-specific object that contains all RHeap info
   527     // This is the RHeap-specific object that contains all RHeap info
   232     TMemSpyHeapInfoRHeap& rHeapInfo = masterHeapInfo.AsRHeap();
   528     TMemSpyHeapInfoRHeap& rHeapInfo = masterHeapInfo.AsRHeap();
   233 
   529 
       
   530     // This is the object data for the RHeap instance
       
   531     TMemSpyHeapObjectDataRHeap& rHeapObjectData = rHeapInfo.ObjectData();
       
   532     aHeap.CopyObjectDataTo( rHeapObjectData );
   234 
   533 
   235     // When walking the kernel heap we must keep track of the free cells
   534     // When walking the kernel heap we must keep track of the free cells
   236     // without allocating any more memory (on the kernel heap...)
   535     // without allocating any more memory (on the kernel heap...)
   237     //
   536     //
   238     // Therefore, we start a stream immediately, which is actually already
   537     // Therefore, we start a stream immediately, which is actually already
   243     RMemSpyMemStreamWriter stream;
   542     RMemSpyMemStreamWriter stream;
   244     TInt32* pCount = NULL;
   543     TInt32* pCount = NULL;
   245 
   544 
   246     // We must walk the client's heap in order to build statistics
   545     // We must walk the client's heap in order to build statistics
   247     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - calling heap walker constructor..."));
   546     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - calling heap walker constructor..."));
   248     RMemSpyDriverHeapWalker heapWalker(aHeap);
   547     RMemSpyDriverHeapWalker heapWalker( aHeap, aIsDebugAllocator );
   249     if  ( aTransferBuffer )
   548     if  ( aTransferBuffer )
   250         {
   549         {
   251         // This will allow us to identify that we're writing directly to the stream
   550         // This will allow us to identify that we're writing directly to the stream
   252         stream = OpenXferStream();
   551         stream = OpenXferStream();
   253         iStackStream = &stream;
   552         iStackStream = &stream;
   263         {
   562         {
   264         iStackStream = NULL;
   563         iStackStream = NULL;
   265         TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - not collecting free cells"));
   564         TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - not collecting free cells"));
   266         }
   565         }
   267 
   566 
       
   567     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - locking system..." ));
       
   568     NKern::LockSystem();
       
   569     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - disabling interrupts..." ));
       
   570     const TInt irq = NKern::DisableAllInterrupts();
   268     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - starting traversal..." ));
   571     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - starting traversal..." ));
   269 
   572 
   270 #if defined( TRACE_TYPE_KERNELHEAP )
   573 #if defined( TRACE_TYPE_KERNELHEAP )
   271     heapWalker.SetPrintDebug();
   574     heapWalker.SetPrintDebug();
   272 #endif
   575 #endif
   273     r = heapWalker.Traverse();
   576     r = heapWalker.Traverse();
   274 
   577 
   275     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - finished traversal - err: %d, iStackStream: 0x%08x, pCount: 0x%08x, isOpen: %d", 
   578     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - restoring interrupts..." ));
   276                             r, iStackStream, pCount, ( iStackStream == NULL ? 0 : iStackStream->IsOpen() ) ));
   579     NKern::RestoreInterrupts( irq );
       
   580     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - finished traversal - err: %d, iStackStream: 0x%08x, pCount: 0x%08x, isOpen: %d", r, iStackStream, pCount, ( iStackStream == NULL ? 0 : iStackStream->IsOpen() ) ));
       
   581     NKern::UnlockSystem();
       
   582     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - unlocked system" ));
   277 
   583 
   278     // Write free cells if requested
   584     // Write free cells if requested
   279     if  ( r == KErrNone && iStackStream && iStackStream->IsOpen() && pCount )
   585     if  ( r == KErrNone && iStackStream && iStackStream->IsOpen() && pCount )
   280         {
   586         {
   281         TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - final free cell count: %d", iFreeCellCount ));
   587         TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - final free cell count: %d", iFreeCellCount ));
   288     TMemSpyHeapStatisticsRHeap& rHeapStats = rHeapInfo.Statistics();
   594     TMemSpyHeapStatisticsRHeap& rHeapStats = rHeapInfo.Statistics();
   289     heapWalker.CopyStatsTo( rHeapStats );
   595     heapWalker.CopyStatsTo( rHeapStats );
   290 
   596 
   291     // Get remaining meta data that isn't stored elsewhere
   597     // Get remaining meta data that isn't stored elsewhere
   292     TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
   598     TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
   293 	TFullName chunkName;
   599     rHeapMetaData.SetChunkName( aChunkName );
   294 	aHeap.Chunk().FullName(chunkName);
       
   295     rHeapMetaData.SetChunkName(chunkName);
       
   296     rHeapMetaData.SetChunkSize( (TUint) aHeap.Chunk().Size() );
   600     rHeapMetaData.SetChunkSize( (TUint) aHeap.Chunk().Size() );
   297     rHeapMetaData.SetChunkHandle( &aHeap.Chunk() );
   601     rHeapMetaData.SetChunkHandle( &aHeap.Chunk() );
   298     rHeapMetaData.SetChunkBaseAddress( OSAdaption().DChunk().GetBase(aHeap.Chunk()) );
   602     rHeapMetaData.SetChunkBaseAddress( aHeap.Chunk().Base() );
   299     rHeapMetaData.SetDebugAllocator(aHeap.Helper()->AllocatorIsUdeb());
   603     rHeapMetaData.SetDebugAllocator( aIsDebugAllocator );
       
   604     rHeapMetaData.SetHeaderSizeFree( RMemSpyDriverRHeapBase::FreeCellHeaderSize() );
       
   605     rHeapMetaData.SetHeaderSizeAllocated( RMemSpyDriverRHeapBase::AllocatedCellHeaderSize( aIsDebugAllocator ) );
   300     rHeapMetaData.SetUserThread( EFalse );
   606     rHeapMetaData.SetUserThread( EFalse );
   301     rHeapMetaData.SetSharedHeap( ETrue );
   607     rHeapMetaData.SetSharedHeap( ETrue );
   302 	rHeapMetaData.iHeapSize = aHeap.Helper()->CommittedSize();
   608 
   303 	rHeapMetaData.iAllocatorAddress = (TAny*)aHeap.Helper()->AllocatorAddress();
   609     // Get any heap-specific info
   304 	rHeapMetaData.iMinHeapSize = aHeap.Helper()->MinCommittedSize();
   610     aHeap.GetHeapSpecificInfo( masterHeapInfo );
   305 	rHeapMetaData.iMaxHeapSize = aHeap.Helper()->MaxCommittedSize();
       
   306 
   611 
   307     PrintHeapInfo( masterHeapInfo );
   612     PrintHeapInfo( masterHeapInfo );
   308 
   613 
   309     // Update info ready for writing back to the user-side
   614     // Update info ready for writing back to the user-side
   310     if  ( r == KErrNone )
   615     if  ( r == KErrNone )
   334 
   639 
   335 
   640 
   336 
   641 
   337 
   642 
   338 
   643 
   339 TBool DMemSpyDriverLogChanHeapBase::HandleHeapCell(TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt /*aNestingLevel*/, TInt /*aAllocNumber*/)
   644 TBool DMemSpyDriverLogChanHeapBase::HandleHeapCell( TInt aCellType, TAny* aCellAddress, TInt aLength, TInt /*aNestingLevel*/, TInt /*aAllocNumber*/ )
   340     {
   645     {
   341     TInt error = KErrNone;
   646     TInt error = KErrNone;
   342     //
   647     //
   343     if  (aCellType & EMemSpyDriverFreeCellMask)
   648     if  ( aCellType == EMemSpyDriverGoodFreeCell || aCellType == EMemSpyDriverBadFreeCellAddress || aCellType == EMemSpyDriverBadFreeCellSize )
   344         {
   649         {
       
   650         TMemSpyDriverFreeCell cell;
       
   651         cell.iType = aCellType;
       
   652         cell.iAddress = aCellAddress;
       
   653         cell.iLength = aLength;
       
   654         //
   345         if  ( iStackStream )
   655         if  ( iStackStream )
   346             {
   656             {
   347             if  ( !iStackStream->IsFull() )
   657             if  ( !iStackStream->IsFull() )
   348                 {
   658                 {
   349                 ++iFreeCellCount;
   659                 ++iFreeCellCount;
   357                 {
   667                 {
   358                 Kern::Printf( "DMemSpyDriverLogChanHeapBase::HandleHeapCell - Kernel Free Cell stack stream IS FULL!" );
   668                 Kern::Printf( "DMemSpyDriverLogChanHeapBase::HandleHeapCell - Kernel Free Cell stack stream IS FULL!" );
   359                 error = KErrAbort;
   669                 error = KErrAbort;
   360                 }
   670                 }
   361             }
   671             }
   362        }
   672         else
       
   673             {
       
   674             NKern::ThreadEnterCS();
       
   675             error = iFreeCells.Append( cell );
       
   676             NKern::ThreadLeaveCS();
       
   677             //
       
   678             if ( error == KErrNone )
       
   679                 {
       
   680                 ++iFreeCellCount;
       
   681                 }
       
   682             }
       
   683         }
   363     //
   684     //
   364     return ( error == KErrNone );
   685     return ( error == KErrNone );
   365     }
   686     }
   366 
   687 
   367 
   688 
   368 void DMemSpyDriverLogChanHeapBase::HandleHeapWalkInit()
   689 void DMemSpyDriverLogChanHeapBase::HandleHeapWalkInit()
   369 	{
   690     {
   370 	iFreeCellCount = 0;
   691     // Can't delete the free cell list here as we might be walking the kernel heap
   371 	}
   692     iFreeCellCount = 0;
       
   693     }
       
   694 
       
   695 
       
   696 
       
   697 
       
   698 
       
   699 
       
   700 TInt DMemSpyDriverLogChanHeapBase::PrepareFreeCellTransferBuffer()
       
   701     {
       
   702     // Transfer free cells immediately from xfer stream
       
   703     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrepareFreeCellTransferBuffer() - START - iHeapStream: 0x%08x", iHeapStream ));
       
   704     __ASSERT_ALWAYS( !iHeapStream, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapFreeCellStreamNotClosed ) );
       
   705     //
       
   706     TInt r = KErrNoMemory;
       
   707     //
       
   708     NKern::ThreadEnterCS();
       
   709     //
       
   710     iHeapStream = new RMemSpyMemStreamWriter();
       
   711     if  ( iHeapStream )
       
   712         {
       
   713         const TInt requiredMemory = CalculateFreeCellBufferSize();
       
   714         r = OpenXferStream( *iHeapStream, requiredMemory );
       
   715         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrepareFreeCellTransferBuffer() - requested %d bytes for free cell list, r: %d", requiredMemory, r ));
       
   716 
       
   717         if  ( r == KErrNone )
       
   718             {
       
   719             const TInt count = iFreeCells.Count();
       
   720             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrepareFreeCellTransferBuffer() - free cell count: %d", count ));
       
   721             //
       
   722             iHeapStream->WriteInt32( count );
       
   723             for( TInt i=0; i<count; i++ )
       
   724                 {
       
   725                 const TMemSpyDriverFreeCell& cell = iFreeCells[ i ];
       
   726                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrepareFreeCellTransferBuffer() - storing entry: %d", i ));
       
   727                 //
       
   728                 iHeapStream->WriteInt32( cell.iType );
       
   729                 iHeapStream->WriteUint32( reinterpret_cast<TUint32>( cell.iAddress ) );
       
   730                 iHeapStream->WriteInt32( cell.iLength );
       
   731                 }
       
   732 
       
   733             // Finished with the array now
       
   734             iFreeCells.Reset();
       
   735 
       
   736             // We return the amount of client-side memory that needs to be allocated to hold the buffer
       
   737             r = requiredMemory;
       
   738             }
       
   739         }
       
   740     //
       
   741     NKern::ThreadLeaveCS();
       
   742                
       
   743     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrepareFreeCellTransferBuffer() - END - r: %d", r));
       
   744 	return r;
       
   745     }
       
   746 
       
   747 
       
   748 TInt DMemSpyDriverLogChanHeapBase::FetchFreeCells( TDes8* aBufferSink )
       
   749     {
       
   750     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::FetchFreeCells() - START - iHeapStream: 0x%08x", iHeapStream ));
       
   751     __ASSERT_ALWAYS( iHeapStream, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapFreeCellStreamNotOpen ) );
       
   752 
       
   753     TInt r = KErrNone;
       
   754 
       
   755     // Write buffer to client
       
   756     NKern::ThreadEnterCS();
       
   757     r = iHeapStream->WriteAndClose( aBufferSink );
       
   758 
       
   759     // Tidy up
       
   760     ReleaseFreeCells();
       
   761 
       
   762     NKern::ThreadLeaveCS();
       
   763     //
       
   764     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::FetchFreeCells() - END - r: %d", r));
       
   765 	return r;
       
   766     }
       
   767 
       
   768 
       
   769 
       
   770 TInt DMemSpyDriverLogChanHeapBase::CalculateFreeCellBufferSize() const
       
   771     {
       
   772     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::CalculateFreeCellBufferSize() - START" ));
       
   773 
       
   774     const TInt count = iFreeCells.Count();
       
   775     const TInt entrySize = sizeof( TInt32 ) + sizeof( TInt32 ) + sizeof( TUint32 );
       
   776     const TInt r = ( count * entrySize ) + sizeof( TInt ); // Extra TInt to hold count
       
   777                 
       
   778     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::CalculateFreeCellBufferSize() - END - r: %d, count: %d, entrySize: %d", r, count, entrySize ));
       
   779 	return r;
       
   780     }
       
   781 
       
   782 
       
   783 
       
   784 void DMemSpyDriverLogChanHeapBase::ReleaseFreeCells()
       
   785     {
       
   786 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::ReleaseFreeCells() - START - this: 0x%08x", this ));
       
   787 
       
   788     // Housekeeping
       
   789     NKern::ThreadEnterCS();
       
   790     iFreeCells.Reset();
       
   791     //
       
   792     iStackStream = NULL;
       
   793     //
       
   794     delete iHeapStream;
       
   795     iHeapStream = NULL;
       
   796     NKern::ThreadLeaveCS();
       
   797 
       
   798     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::ReleaseFreeCells() - END - this: 0x%08x", this ));
       
   799     }
       
   800 
       
   801 
       
   802 
       
   803 
       
   804 
       
   805 
       
   806 
       
   807 
       
   808 
       
   809 
       
   810 
       
   811 
       
   812 
       
   813 
       
   814 
       
   815 
       
   816 
       
   817 
       
   818 
       
   819 
       
   820 
       
   821 
       
   822 
       
   823 
       
   824 
       
   825 
       
   826 
       
   827 
       
   828 
   372 
   829 
   373 TInt DMemSpyDriverLogChanHeapBase::OpenKernelHeap( RHeapK*& aHeap, DChunk*& aChunk, TDes8* aClientHeapChunkName )
   830 TInt DMemSpyDriverLogChanHeapBase::OpenKernelHeap( RHeapK*& aHeap, DChunk*& aChunk, TDes8* aClientHeapChunkName )
   374     {
   831     {
   375     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap() - START") );
   832     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap() - START") );
   376 
   833 
   446         kernelHeap = (RHeapK*) kernelHeapChunk->Base();
   903         kernelHeap = (RHeapK*) kernelHeapChunk->Base();
   447 #endif
   904 #endif
   448         // Finalise construction of heap 
   905         // Finalise construction of heap 
   449         if  ( kernelHeap != NULL )
   906         if  ( kernelHeap != NULL )
   450             {
   907             {
   451             TRACE_KH( Kern::Printf( "DMemSpyDriverLogChanHeapBase::OpenKernelHeap - kernelHeapChunk->Base(): 0x%08x", kernelHeapChunk->Base() ) );
   908             TRACE_KH( Kern::Printf( "DMemSpyDriverLogChanHeapBase::OpenKernelHeap - kernelHeap->Base(): 0x%08x, kernelHeapChunk->Base(): 0x%08x", kernelHeap->Base(), kernelHeapChunk->Base() ) );
   452             aHeap = kernelHeap;
   909             aHeap = kernelHeap;
   453             aChunk = kernelHeapChunk;
   910             aChunk = kernelHeapChunk;
   454 
   911 
   455             // Get the chunk name (if the caller asked for it)
   912             // Get the chunk name (if the caller asked for it)
   456             if  ( aClientHeapChunkName )
   913             if  ( aClientHeapChunkName )
   475  	NKern::ThreadLeaveCS();
   932  	NKern::ThreadLeaveCS();
   476 
   933 
   477 	TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap() - END - ret: %d", r ) );
   934 	TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap() - END - ret: %d", r ) );
   478     return r;
   935     return r;
   479     }
   936     }
       
   937 
       
   938 
       
   939 TInt DMemSpyDriverLogChanHeapBase::OpenKernelHeap( RMemSpyDriverRHeapKernelInPlace& aHeap, TDes8* aClientHeapChunkName )
       
   940     {
       
   941     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(IP) - START") );
       
   942 
       
   943     RHeapK* heap = NULL;
       
   944     DChunk* chunk = NULL;
       
   945     TInt r = OpenKernelHeap( heap, chunk, aClientHeapChunkName );
       
   946 	
       
   947     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(IP) - open err: %d", r ) );
       
   948     if  ( r == KErrNone )
       
   949         {
       
   950         aHeap.SetKernelHeap( *heap );
       
   951         aHeap.AssociateWithKernelChunk( chunk, TLinAddr( chunk->iBase ), 0 );
       
   952         }
       
   953 
       
   954 	TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(IP) - END - ret: %d", r ) );
       
   955     return r;
       
   956     }
       
   957 
   480 
   958 
   481 TInt DMemSpyDriverLogChanHeapBase::OpenKernelHeap( RMemSpyDriverRHeapKernelFromCopy& aHeap, TDes8* aClientHeapChunkName )
   959 TInt DMemSpyDriverLogChanHeapBase::OpenKernelHeap( RMemSpyDriverRHeapKernelFromCopy& aHeap, TDes8* aClientHeapChunkName )
   482     {
   960     {
   483     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(CP) - START") );
   961     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(CP) - START") );
   484 
   962 
   537                 TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(CP) - heapCopyChunk->iSize: 0x%08x, heapCopyChunk->iBase: 0x%08x, heapCopyChunkAddress: 0x%08x, physicalAddress: 0x%08x", heapCopyChunk->iSize, heapCopyChunk->iBase, heapCopyChunkAddress, physicalAddress));
  1015                 TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(CP) - heapCopyChunk->iSize: 0x%08x, heapCopyChunk->iBase: 0x%08x, heapCopyChunkAddress: 0x%08x, physicalAddress: 0x%08x", heapCopyChunk->iSize, heapCopyChunk->iBase, heapCopyChunkAddress, physicalAddress));
   538 
  1016 
   539                 NKern::LockSystem();
  1017                 NKern::LockSystem();
   540                 const TUint32 copyLength = heapSize; // TODO Min( heap->Size(), heapSize );
  1018                 const TUint32 copyLength = heapSize; // TODO Min( heap->Size(), heapSize );
   541 
  1019 
   542                 TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(CP) - trying to copy %d (vs orig estimate of %d) bytes from kernel allocator address: 0x%08x", copyLength, heapSize, heap));
  1020                 TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(CP) - trying to copy %d (vs orig estimate of %d) bytes from kernel allocator address: 0x%08x", copyLength, heapSize, heap->Base() ));
   543                 memcpy( (TUint8*) heapCopyChunkAddress, heap, copyLength );
  1021                 memcpy( (TUint8*) heapCopyChunkAddress, heap, copyLength );
   544 
  1022 
   545                 NKern::UnlockSystem();
  1023                 NKern::UnlockSystem();
   546 
  1024 
   547                 TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(CP) - copied kernel heap data" ));
  1025                 TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(CP) - copied kernel heap data" ));