uiacceltk/hitchcock/goommonitor/src/goomcloseapp.cpp
changeset 43 95d73125a086
parent 19 f5bac0badc7e
child 40 dd05fdd05078
--- a/uiacceltk/hitchcock/goommonitor/src/goomcloseapp.cpp	Wed Jun 23 19:14:05 2010 +0300
+++ b/uiacceltk/hitchcock/goommonitor/src/goomcloseapp.cpp	Tue Jul 06 15:18:10 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,38 @@
     {
     FUNC_LOG;
 
+    if ( iAlreadyGaveUp )	//will this ever be true ??? iAlredyGaveup is set true in closeAppEvent, which is called only if app gets notified by goom, which happens only after this
+        {
+        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->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();
+	*/
+	ConditionalClose();
     }
 
 CGOomCloseApp::~CGOomCloseApp()
@@ -77,19 +99,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 +121,7 @@
     iWgId = aRef.WgId();    
     iCloseTimeout = aRef.CloseTimeout();
     iWaitAfterClose = aRef.WaitAfterClose();
+	iAlreadyGaveUp = EFalse;
     }
 
 void CGOomCloseApp::ConstructL()
@@ -115,6 +138,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 +182,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);
     }