sysresmonitoring/oommonitor/tsrc/oomtest/t_oomallocserver/srvsrc/CAllocManager.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysresmonitoring/oommonitor/tsrc/oomtest/t_oomallocserver/srvsrc/CAllocManager.cpp Thu May 27 13:01:09 2010 +0300
@@ -0,0 +1,203 @@
+/*
+* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+
+
+#include "CAllocManager.h"
+#include <e32property.h>
+#include "t_oomdummyplugin_properties.h"
+
+const TInt KOneSecond = 1000000;
+
+CAllocManager::CAllocManager()
+ {
+ // No implementation required
+ }
+
+CAllocManager::~CAllocManager()
+ {
+ delete iAllocationTimer;
+ iSimulations.ResetAndDestroy();
+ }
+
+CAllocManager* CAllocManager::NewLC()
+ {
+ CAllocManager* self = new (ELeave) CAllocManager();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+CAllocManager* CAllocManager::NewL()
+ {
+ CAllocManager* self = CAllocManager::NewLC();
+ CleanupStack::Pop(); // self;
+ return self;
+ }
+
+void CAllocManager::ConstructL()
+ {
+ iAllocationTimer = CPeriodic::NewL(CActive::EPriorityStandard);
+ }
+
+TInt CAllocManager::SimulationTickStatic(TAny *aPtr)
+ {
+ ((CAllocManager*)aPtr)->SimulationTick();
+ return KErrNone;
+ }
+
+void CAllocManager::SimulationTick()
+ {
+ for(TInt i=iSimulations.Count()-1; i>=0; i--)
+ {
+ iSimulations[i]->SimulationTick();
+ }
+ }
+
+TInt CAllocManager::Reset()
+ {
+ StopAllocating();
+ iSimulations.ResetAndDestroy();
+ return KErrNone;
+ }
+
+TInt CAllocManager::StartAllocating()
+ {
+ iAllocationTimer->Cancel();
+ iAllocationTimer->Start(KOneSecond, KOneSecond, TCallBack(SimulationTickStatic, this));
+ return KErrNone;
+ }
+
+TInt CAllocManager::StopAllocating()
+ {
+ iAllocationTimer->Cancel();
+ return KErrNone;
+ }
+
+void CAllocManager::ConfigureL(TUint aPlugin, TUint aAllocRate, TUint aAllocInitial, TUint aAllocLimit)
+ {
+ TInt sim = FindSimulation(aPlugin);
+ if(sim>=0)
+ {
+ delete iSimulations[sim];
+ iSimulations.Remove(sim);
+ }
+ CAllocSimulation* newsim = CAllocSimulation::NewLC(aAllocLimit, aAllocInitial, aAllocRate, aPlugin);
+ iSimulations.AppendL(newsim);
+ CleanupStack::Pop(newsim);
+ }
+
+TInt CAllocManager::MemoryLow(TUint aPlugin)
+ {
+ TInt sim = FindSimulation(aPlugin);
+ if(sim>=0)
+ {
+ iSimulations[sim]->SetPaused(ETrue);
+ iSimulations[sim]->FreeMemory();
+ return KErrNone;
+ }
+ else return KErrNotFound;
+ }
+
+TInt CAllocManager::MemoryGood(TUint aPlugin)
+ {
+ TInt sim = FindSimulation(aPlugin);
+ if(sim>=0)
+ {
+ iSimulations[sim]->SetPaused(EFalse);
+ return KErrNone;
+ }
+ else return KErrNotFound;
+ }
+
+TInt CAllocManager::FindSimulation(TUint aUid)
+ {
+ return iSimulations.Find<TUint>(aUid, CAllocSimulation::CompareTo);
+ }
+
+CAllocSimulation::CAllocSimulation(TInt aAllocLimit, TInt aAllocInitial,
+ TInt aAllocRate, TUint aUid) :
+ iAllocLimit(aAllocLimit),
+ iAllocInitial(aAllocInitial),
+ iAllocRate(aAllocRate),
+ iUid(aUid)
+ {
+ // No implementation required
+ }
+
+CAllocSimulation::~CAllocSimulation()
+ {
+ iChunk.Close();
+ }
+
+CAllocSimulation* CAllocSimulation::NewLC(TInt aAllocLimit, TInt aAllocInitial,
+ TInt aAllocRate, TUint aUid)
+ {
+ CAllocSimulation* self = new (ELeave) CAllocSimulation(aAllocLimit, aAllocInitial,
+ aAllocRate, aUid);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+CAllocSimulation* CAllocSimulation::NewL(TInt aAllocLimit, TInt aAllocInitial,
+ TInt aAllocRate, TUint aUid)
+ {
+ CAllocSimulation* self = CAllocSimulation::NewLC(aAllocLimit, aAllocInitial,
+ aAllocRate, aUid);
+ CleanupStack::Pop(); // self;
+ return self;
+ }
+
+void CAllocSimulation::ConstructL()
+ {
+ User::LeaveIfError(iChunk.CreateLocal(iAllocInitial, iAllocLimit));
+ }
+
+void CAllocSimulation::SimulationTick()
+ {
+ if(!iPaused)
+ {
+ TUint allocnext = iAllocCurrent + iAllocRate;
+ if(allocnext < iAllocInitial) allocnext = iAllocInitial;
+ else if(allocnext > iAllocLimit) allocnext = iAllocLimit;
+ if(iAllocCurrent != allocnext && KErrNone == iChunk.Adjust(iAllocCurrent))
+ {
+ iAllocCurrent = allocnext;
+ RProperty::Set(KUidOomPropertyCategory, iUid + KOOMDummyPluginCurrentAllocationBytes, iAllocCurrent);
+ }
+ }
+ }
+
+void CAllocSimulation::SetPaused(TBool aPaused)
+ {
+ iPaused = aPaused;
+ }
+
+void CAllocSimulation::FreeMemory()
+ {
+ iChunk.Adjust(0);
+ iAllocCurrent = 0;
+ RProperty::Set(KUidOomPropertyCategory, iUid + KOOMDummyPluginCurrentAllocationBytes, iAllocCurrent);
+ }
+
+TBool CAllocSimulation::CompareTo(const TUint* aUid, const CAllocSimulation& aSelf)
+ {
+ return *aUid==aSelf.iUid;
+ }
+