sysresmonitoring/oommonitor/tsrc/oomtest/t_oomallocserver/srvsrc/CAllocManager.cpp
changeset 35 13fd6fd25fe7
--- /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;
+	}
+