webengine/osswebengine/MemoryManager/Src/MemoryPool.cpp
branchRCL_3
changeset 91 30342f40acbf
parent 59 1f3c3f2f5b0a
child 92 e1bea15f9a39
--- 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 <avkon.rsg>
 #include <StringLoader.h>
 #include <WebKit.rsg>
+#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