diff -r 3a60ebea00d0 -r cd0ae4656946 uiacceltk/hitchcock/goommonitor/src/goomcloseapp.cpp --- 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 +#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(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(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); }