diff -r 800203832575 -r 30342f40acbf webengine/osswebengine/MemoryManager/Src/MemoryPool.cpp --- a/webengine/osswebengine/MemoryManager/Src/MemoryPool.cpp Mon Jun 21 16:54:17 2010 +0300 +++ b/webengine/osswebengine/MemoryManager/Src/MemoryPool.cpp Thu Jul 15 19:53:20 2010 +0300 @@ -32,6 +32,7 @@ #include #include #include +#include "MemoryLogger.h" // CONSTANTS @@ -132,6 +133,7 @@ //----------------------------------------------------------------------------- void CMemoryPool::CollectMemory(TUint aSize) { + MEM_LOG("CMemoryPool::CollectMemory - run"); if( iIsCollecting ) return; iIsCollecting = ETrue; @@ -139,11 +141,9 @@ { iCollectors[i]->Collect(aSize); } - - User::CompressAllHeaps(); iIsCollecting = EFalse; - if (iStopScheduler) + if (iStopScheduler && !iIsStopping ) iStopScheduler->Start( CStopScheduler::ECheckMemory, aSize ); } @@ -467,11 +467,19 @@ //----------------------------------------------------------------------------- // CNewSymbianHeapPool::FreeMemory //----------------------------------------------------------------------------- -TUint CNewSymbianHeapPool::FreeMemory(TFreeMem& /*aFree*/ ) +TUint CNewSymbianHeapPool::FreeMemory(TFreeMem& aFree ) { // TODO: implement free_memory - return KMaxTUint; -// return free_memory( aFree.iPool, aFree.iHeap, aFree.iHal ); + aFree.iPool = 0; + aFree.iHeap = 0; + + TInt freeRAM; + if(HAL::Get(HALData::EMemoryRAMFree, freeRAM) == KErrNone) + aFree.iHal = freeRAM; + else + aFree.iHal = 0; + + return KMaxTUint; // not fully implemented } //----------------------------------------------------------------------------- @@ -480,8 +488,16 @@ TAny* CNewSymbianHeapPool::DoAlloc( TUint aSize ) { TAny *p = iAlloc->Alloc( aSize ); - if (!p) + if(iAlloc->isLowSystemMemory && p) // use this a pre OOM indicator + { + iStopScheduler->Start( CStopScheduler::ECheckMemory, 0 ); + iAlloc->isLowSystemMemory = 0; // reset so that we don't check before next request for RAM + } + + if (!p) { ShowOOMDialog(); + MEM_LOG("CNewSymbianHeapPool::DoAlloc - failed"); + } return p; } @@ -494,7 +510,12 @@ iMemStatus &= ~ERescueOOM; TAny* p = iAlloc->ReAlloc( aPtr, aSize ); - + if(iAlloc->isLowSystemMemory && p) // use this a pre OOM indicator + { + iStopScheduler->Start( CStopScheduler::ECheckMemory, 0 ); + iAlloc->isLowSystemMemory = 0; // reset so that we don't check before next request for RAM + } + // check memory manager status if( !p || iMemStatus & ERescueOOM ) { @@ -510,6 +531,11 @@ NotifyAndStop(); } +#ifdef OOM_LOGGING + if(!p) + MEM_LOG("CNewSymbianHeapPool::ReAllocate - failed"); +#endif + return p; } @@ -585,6 +611,11 @@ { iMemStatus |= ECheckOOM; NotifyAndStop(); + +#ifdef OOM_LOGGING + MEM_LOG("CNewSymbianHeapPool::PreCheck - failed !!"); + DumpHeapLogs(aTotalSize); +#endif return EFalse; } @@ -711,6 +742,8 @@ void CNewSymbianHeapPool::ShowOOMDialog() { + MEM_LOG("CNewSymbianHeapPool::ShowOOMDialog - called"); + // Don't show it if we did once already if (iOOMDisplayed) return; @@ -739,9 +772,9 @@ } #ifdef OOM_LOGGING -void CNewSymbianHeapPool::DumpHeapLogs() +void CNewSymbianHeapPool::DumpHeapLogs(TInt aFailSize) { - iAlloc->dump_heap_logs(0); + iAlloc->dump_heap_logs(aFailSize); iAlloc->dump_dl_free_chunks(); } #endif