kerneltest/e32test/bench/t_kernbm.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/bench/t_kernbm.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,146 @@
+// Copyright (c) 1995-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:
+// e32test\bench\t_kernbm.cpp
+// Overview:
+// Benchmark the performance of some kernel functions including RTimer
+// and RThread. Calculation time required for creation & closing of
+// timer objects, suspension of threads, handling kernel messages, and 
+// the number of threads created and stopped within a fixed time period.
+// API Information:
+// RTimer, RThread.
+// Details:
+// - Calculate and display the time required to create and close 1000 
+// thread-relative timer objects.
+// - Count and print the time taken to suspend the thread for 100000 times.
+// - Count and display the time consumed for 100000 kernel messages.
+// - Get and print the number of threads created and stopped within a 
+// specified timeframe, verify the ExitType, and ExitReason of the threads.
+// Platforms/Drives/Compatibility:
+// All.
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+#define	TIMECOUNT()	User::NTickCount()
+#define TIMEDIFFMS(i,f)	(f-i)
+
+LOCAL_D RTest test(_L("T_KERNBM"));
+volatile TInt Count;
+volatile TBool Stop;
+
+#ifdef __EPOC32__
+extern void DummyKernMsg();
+#else
+void DummyKernMsg()
+	{}
+#endif
+
+LOCAL_C TInt ThreadFunction(TAny*)
+	{
+	User::WaitForAnyRequest();
+	return 0;
+	}
+
+TInt TestThread(TAny*)
+	{
+	return 0;
+	}
+
+TInt TestThreadCreate(TAny*)
+	{
+	RThread t;
+	t.SetPriority(EPriorityAbsoluteVeryLow);
+	while (!Stop)
+		{
+		t.Create(KNullDesC,TestThread,4096,NULL,NULL);
+		t.Resume();
+		t.Close();
+		++Count;
+		}
+	return 0;
+	}
+
+GLDEF_C TInt E32Main()
+	{
+	test.Title();
+	test.Start(_L("Start...\n"));
+
+	RTimer t;
+	TInt i;
+	TInt r;
+	TUint32 c1=TIMECOUNT();
+	for (i=0; i<1000; i++)
+		{
+		r=t.CreateLocal();
+		if (r!=KErrNone)
+			test(0);
+		t.Close();
+		}
+	TUint32 c2=TIMECOUNT();
+	test.Printf(_L("Create and close 1000 timers takes %d ms\n"),TIMEDIFFMS(c1,c2));
+
+	RThread thrd;
+	r=thrd.Create(_L("DodgyThread"),ThreadFunction,4096,1024,8192,NULL);
+	test(r==KErrNone);
+	test.Printf(_L("DodgyThread created\n"));
+	thrd.SetPriority(EPriorityMore);
+	thrd.Resume();
+	test.Printf(_L("DodgyThread resumed\n"));
+	c1=TIMECOUNT();
+	for (i=0; i<100000; i++)
+		{
+		thrd.Suspend();
+		}
+	c2=TIMECOUNT();
+	test.Printf(_L("Suspend 100000 times takes %d ms\n"),TIMEDIFFMS(c1,c2));
+	thrd.Kill(0);
+	thrd.Close();
+	test.Printf(_L("DodgyThread killed\n"));
+
+	c1=TIMECOUNT();
+	for (i=0; i<100000; i++)
+		{
+		DummyKernMsg();
+		}
+	c2=TIMECOUNT();
+	test.Printf(_L("100000 kernel messages take %d ms\n"),TIMEDIFFMS(c1,c2));
+
+	test.Next(_L("Create thread test"));
+	r=thrd.Create(_L("Creator"),TestThreadCreate,4096,NULL,NULL);
+	test(r==KErrNone);
+	thrd.SetPriority(EPriorityLess);
+	RThread().SetPriority(EPriorityMuchMore);
+	TRequestStatus s;
+	thrd.Logon(s);
+	thrd.Resume();
+	Count=0;
+	Stop=EFalse;
+	c1=TIMECOUNT();
+	User::After(1000000);
+	Stop=ETrue;
+	User::WaitForRequest(s);
+	c2=TIMECOUNT();
+	test(thrd.ExitType()==EExitKill);
+	test(thrd.ExitReason()==0);
+	thrd.Close();
+	test.Printf(_L("%d threads created and stopped in %dms\n"),Count,TIMEDIFFMS(c1,c2));
+
+	test.End();
+	return 0;
+	}
+