diff -r 924385140d98 -r c2c61fdca848 sysresmonitoring/oommonitor/src/oomrunplugin.cpp --- a/sysresmonitoring/oommonitor/src/oomrunplugin.cpp Tue Aug 31 15:24:25 2010 +0300 +++ b/sysresmonitoring/oommonitor/src/oomrunplugin.cpp Wed Sep 01 12:24:48 2010 +0100 @@ -21,6 +21,9 @@ #include "oommonitorplugin.h" #include "oompanic.h" +#include +#include + COomRunPlugin* COomRunPlugin::NewL(TUint aPluginId, COomRunPluginConfig& aConfig, MOomActionObserver& aStateChangeObserver, COomMonitorPlugin& aPlugin, COomMonitorPluginV2* aV2Plugin) { FUNC_LOG; @@ -34,21 +37,40 @@ // Run the OOM plugin in order to free memory // Call the COomAction::MemoryFreed when it is done -void COomRunPlugin::FreeMemory(TInt aBytesRequested, TBool) +void COomRunPlugin::FreeMemory(TInt aBytesRequested, TBool aIsDataPaged) { FUNC_LOG; - TRACES1("COomRunPlugin::FreeMemory: iPluginId = %x", iPluginId); - - // Ask the plugin to free some memory - + iFreeMemoryCalled = ETrue; + // Do we have a V2 plugin, if so then use it if (iV2Plugin) + { + //RDebug::Printf("COomRunPlugin::FreeMemory: Requesting to free the RAM iV2Plugin->FreeRam(%d) \n",aBytesRequested); iV2Plugin->FreeRam(aBytesRequested); - else - // If we only have a V1 plugin then use that + } + else if( aIsDataPaged ) + { + if (IsAppDataPaged(iPlugin) ) + { + //the plugins implemented by the application which are WDP enabled + //are notified. + //RDebug::Printf("COomRunPlugin::FreeMemory: Requesting to free the RAM to Data paged app \n"); + iPlugin.FreeRam(); + } + else + { + //Request is for freeing the paged memory(swap) but the App(iPlugin belongs to) + //is non WDP no need to notify; as it can't free the swap memory + iFreeMemoryCalled = EFalse; + return; + } + } + else + { + //Unpaged memory will be freed in case of non WDP app + //RDebug::Printf("COomRunPlugin::FreeMemory: Requesting to free the RAM \n"); iPlugin.FreeRam(); - - iFreeMemoryCalled = ETrue; + } // Wait for the required time before we signal completion. __ASSERT_DEBUG(!iPluginWaiter->IsActive(), OomMonitorPanic(KStartingActivePluginWaiter)); @@ -94,3 +116,50 @@ iPluginWaiter = COomPluginWaiter::NewL(waitDuration, *this); } + +//----------------------------------------------------------------------------- +// Function: IsAppDataPaged +// Checks whether the application which implements the given +// COomMonitorPlugin is data paged +//----------------------------------------------------------------------------- +// +TBool COomRunPlugin::IsAppDataPaged + ( COomMonitorPlugin& aPlugin ) const + { + FUNC_LOG; + /* + /TRACES1("COomRunPlugin::IsAppDataPaged: aPlugin.AppId() = %x ", aPlugin.AppId() ); + //RDebug::Printf("COomRunPlugin::IsAppDataPaged: aPlugin.AppId() = %x ", aPlugin.AppId() ); + */ + //the function find the process with given appid and check + //application supports the data paging. + RProcess clientprocess; + TApaTaskList taskList(aPlugin.WsSession()); + RThread clientthread; + TInt err = clientthread.Open + (taskList.FindApp(aPlugin.AppId()).ThreadId()); + + //RDebug::Printf("COomRunPlugin::IsAppDataPaged: clientthread.Open() err = %d ", err ); + + if( !err ) + { + //getting the process which provides the plugin + err = clientthread.Process(clientprocess); + RDebug::Printf("COomRunPlugin::IsAppDataPaged: clientthread.Process() err = %d ", err ); + + if( !err ) + { + //checking whether the process is Data paged or not + TBool isdatapaged = clientprocess.DefaultDataPaged(); + clientprocess.Close(); + clientthread.Close(); + //RDebug::Printf("COomRunPlugin::IsAppDataPaged: isdatapaged = %d ", isdatapaged ); + + return isdatapaged; + } + clientthread.Close(); + } + //could not successfully open the handle of process or thread, + //the return EFalse + return EFalse; + }