uiacceltk/hitchcock/goommonitor/src/goomcloseapp.cpp
branchRCL_3
changeset 15 cd0ae4656946
parent 8 46927d61fef3
child 17 c9d868f1e20c
--- a/uiacceltk/hitchcock/goommonitor/src/goomcloseapp.cpp	Wed Jun 09 10:41:25 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/src/goomcloseapp.cpp	Mon Jun 21 16:41:52 2010 +0300
@@ -18,6 +18,8 @@
 
 #include <apgtask.h>
 
+#include "goommemorymonitor.h"
+#include "goomwindowgrouplist.h"
 #include "goomcloseapp.h"
 #include "goomtraces.h"
 #include "goomappclosetimer.h"
@@ -42,18 +44,30 @@
     {
     FUNC_LOG;
 
+    if ( iAlreadyGaveUp )
+        {
+        if (iAppCloseTimer)
+        	{
+			iAppCloseTimer->Cancel();
+    		}
+			
+    	if (iAppCloseWatcher)
+        	{
+			iAppCloseWatcher->Cancel();
+			}
+			
+		RDebug::Printf("GOOM: I should not activate actions for app that already refused to exit !!!!");
+        MemoryFreed(KErrNone);
+        return;
+        }    
+
     iAppCloserRunning = ETrue;
     
     // Set the TApaTask to the app
     iCurrentTask.SetWgId(iWgId);
-    
-    // Start a timer and the thread watcher 
-    iAppCloseTimer->SetState(CGOomAppCloseTimer::EGOomAppClosing);
-    iAppCloseTimer->After(iCloseTimeout * 1000);
-    iAppCloseWatcher->Start(iCurrentTask);
-    // Tell the app to close
-    TRACES2("CGOomCloseApp::FreeMemory: Closing app with window group id %d Timeout = %d",iWgId, iCloseTimeout);
-    iCurrentTask.EndTask();
+
+    // start the chain
+    ConditionalClose();
     }
 
 CGOomCloseApp::~CGOomCloseApp()
@@ -77,19 +91,19 @@
 
     // The application has closed (or we have a timeout)
     iAppCloserRunning = EFalse;
+    iAlreadyGaveUp = ETrue;
     
     if (iAppCloseTimer)
         {
-            iAppCloseTimer->Cancel();
-            iAppCloseTimer->SetState(CGOomAppCloseTimer::EGOomAppKilled);
-            iAppCloseTimer->After(iWaitAfterClose * 1000);
+        iAppCloseTimer->Cancel();
+        iAppCloseTimer->SetState(CGOomAppCloseTimer::EGOomAppKilled);
+        iAppCloseTimer->After(iWaitAfterClose * 1000);
         }
     
     if (iAppCloseWatcher)
+        {
         iAppCloseWatcher->Cancel(); 
-    
-    
-    //MemoryFreed(KErrNone);
+        }    
     }
 
 void CGOomCloseApp::Reconfigure(const TActionRef& aRef)
@@ -99,6 +113,7 @@
     iWgId = aRef.WgId();    
     iCloseTimeout = aRef.CloseTimeout();
     iWaitAfterClose = aRef.WaitAfterClose();
+	iAlreadyGaveUp = EFalse;
     }
 
 void CGOomCloseApp::ConstructL()
@@ -115,6 +130,38 @@
     FUNC_LOG;
     }
 
+TBool IsConsumingMemory(TInt aWgId)
+    {
+    FUNC_LOG;
+    // Something more efficient could be done here
+    CMemoryMonitor* globalMemoryMonitor = static_cast<CMemoryMonitor*>(Dll::Tls());
+    globalMemoryMonitor->GetWindowGroupList()->Refresh();
+    return (globalMemoryMonitor->GetWindowGroupList()->GetIndexFromWgId(aWgId) != KErrNotFound);
+    }    
+    
+void CGOomCloseApp::ConditionalClose()
+    {
+    FUNC_LOG;
+    // Start a timer and the thread watcher 
+    iAppCloseTimer->SetState(CGOomAppCloseTimer::EGOomAppClosing);
+    iAppCloseTimer->After(iCloseTimeout * 1000);
+    // Tell the app to close
+	// We are not asking system applications to exit anyway, so we'll send legacy event only
+	// even we have powermgmt capability 
+    TRACES2("CGOomCloseApp::FreeMemory: Closing app with window group id %d Timeout = %d",iWgId, iCloseTimeout);
+	TWsEvent event;
+	event.SetType(EEventUser);
+	TInt* eventData = (TInt*)(event.EventData());
+	*eventData = EApaSystemEventShutdown;
+	eventData++;
+	*eventData = KGoomMemoryLowEvent;
+	
+	// should proxy the session..
+    CMemoryMonitor* globalMemoryMonitor = static_cast<CMemoryMonitor*>(Dll::Tls());
+    globalMemoryMonitor->iWs.SendEventToWindowGroup(iWgId, event);
+    }    
+
+
 // ----------------------------------------------
 // Callback from iAppCloseTimer
 // App refused to exit gracefully on given time
@@ -127,12 +174,18 @@
         {
         iAppCloseWatcher->Cancel(); 
         }
-    
-    iCurrentTask.KillTask();
-    iAppCloserRunning = EFalse;
-    
-    iAppCloseTimer->SetState(CGOomAppCloseTimer::EGOomAppKilled);
-    iAppCloseTimer->After(iWaitAfterClose * 1000);
+        
+    if(IsConsumingMemory(iWgId))    
+        {    
+        iCurrentTask.KillTask();
+        iAppCloserRunning = EFalse; // not sure if intended (?)
+        iAppCloseTimer->SetState(CGOomAppCloseTimer::EGOomAppKilled);
+        iAppCloseTimer->After(iWaitAfterClose * 1000);
+        }
+    else
+        { // application has released its graphics resources -> we are no more interested about it
+        CloseAppEvent();
+        }    
     //MemoryFreed(KErrNone);
     }