--- 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);
}