kerneltest/e32test/benchmark/overhead.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/benchmark/overhead.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,85 @@
+// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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 <e32test.h>
+
+#include "bm_suite.h"
+
+class Overhead : public BMProgram
+	{
+	typedef void (*MeasurementFunc)(TBMResult*, TBMUInt64 aIter);
+	struct Measurement 
+		{
+		MeasurementFunc iFunc;
+		TPtrC			iName;
+
+		Measurement(MeasurementFunc aFunc, const TDesC&	aName) : iFunc(aFunc), iName(aName) {}
+		};
+public :
+	Overhead() : BMProgram(_L("Overhead"))
+		{}
+	virtual TBMResult* Run(TBMUInt64 aIter, TInt* aCount);
+private:
+	static TBMResult iResults[];
+	static Measurement iMeasurements[];
+
+	static void TimerStampOverhead(TBMResult*, TBMUInt64 aIter);
+	};
+
+Overhead::Measurement Overhead::iMeasurements[] =
+	{
+	Measurement(&Overhead::TimerStampOverhead, _L("Getting Timer Stamp Overhead"))
+	};
+TBMResult Overhead::iResults[sizeof(Overhead::iMeasurements)/sizeof(Overhead::iMeasurements[0])];
+
+static Overhead overhead;
+
+void Overhead::TimerStampOverhead(TBMResult* aResult, TBMUInt64 aIter)
+	{
+	for (TBMUInt64 i = 0; i < aIter; ++i)
+		{		
+		TBMTicks t1, t2;
+		::bmTimer.Stamp(&t1);
+		::bmTimer.Stamp(&t2);
+		aResult->Cumulate(TBMTicksDelta(t1, t2));
+		//
+		// Enable other threads to run
+		//
+		TInt prio = BMProgram::SetAbsPriority(RThread(), overhead.iOrigAbsPriority);
+		BMProgram::SetAbsPriority(RThread(), prio);	
+		}
+	}
+						
+TBMResult* Overhead::Run(TBMUInt64 aIter, TInt* aCount)
+	{
+	TInt count = sizeof(iResults)/sizeof(iResults[0]);
+
+	for (TInt i = 0; i < count; ++i)
+		{
+		iResults[i].Reset(iMeasurements[i].iName);
+		iMeasurements[i].iFunc(&iResults[i], aIter);
+		iResults[i].Update();
+		}
+	
+	*aCount = count;
+	return iResults;
+	}
+
+void AddOverhead()
+	{
+	BMProgram* next = bmSuite;
+	bmSuite=(BMProgram*)&overhead;
+	bmSuite->Next()=next;
+	}