kerneltest/e32test/mmu/t_mmubm.cpp
changeset 0 a41df078684a
child 109 b3a1d9898418
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/mmu/t_mmubm.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,216 @@
+// 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\mmu\t_mmubm.cpp
+// Overview:
+// Time MMU allocation & deallocation
+// API Information:
+// RChunk
+// Details:
+// - Allocate and release a 1 MB chunk 100 times and time how long it takes.
+// - Allocate and release a 2 MB chunk 100 times and time how long it takes.
+// - Allocate and release a 7 MB chunk 100 times and time how long it takes.
+// - Allocate a 7 MB chunk once and time how long it takes.
+// - Deallocate a 7 MB chunk once and time how long it takes.
+// Platforms/Drives/Compatibility:
+// All.
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#define __E32TEST_EXTENSION__
+
+#include <e32test.h>
+#include "mmudetect.h"
+#include "d_gobble.h"
+#include "d_memorytest.h"
+#include "freeram.h"
+
+RTest test(_L("T_MMUBM"));
+
+typedef TInt (*TestFunction)(TUint32 aIters, TUint32 aSize);
+
+RMemoryTestLdd MemoryTest;
+RChunk TheChunk;
+
+LOCAL_C TInt AllocPhysical(TUint32 aIters, TUint32 aSize)
+	{
+	return MemoryTest.AllocPhysTest(aIters, aSize * 0x00100000);
+	}
+
+LOCAL_C TInt AllocPhysical1(TUint32 aIters, TUint32 aSize)
+	{
+	return MemoryTest.AllocPhysTest1(aIters, aSize * 0x00100000);
+	}
+
+LOCAL_C TInt AdjustChunk(TUint32 aIters, TUint32 aSize)
+	{
+	TUint32 i;
+	for (i=0; i<aIters; i++)
+		{
+		TInt r=TheChunk.Adjust(aSize * 0x00100000);
+		if (r!=KErrNone)
+			return r;
+		r=TheChunk.Adjust(0);
+		if (r!=KErrNone)
+			return r;
+		}
+	return KErrNone;
+	}
+
+LOCAL_C TInt AllocateChunk(TUint32 aIters, TUint32 aSize)
+	{
+	aIters = aSize;
+	return TheChunk.Adjust(aSize * 0x00100000);
+	}
+
+LOCAL_C TInt DeallocateChunk(TUint32 , TUint32 )
+	{
+	return TheChunk.Adjust(0);
+	}
+
+LOCAL_C TInt TimedCall(TestFunction aFunction, TUint32& aTime, TUint32 aIters, TUint32 aSize)
+	{
+	TUint32 before=User::NTickCount();
+	TInt r=(*aFunction)(aIters, aSize);
+	TUint32 after=User::NTickCount();
+	aTime=after-before;
+	return r;
+	}
+
+#define DO_TEST(__ret, __func, __time, __iters, __size)\
+	tempSize = __size;\
+	__ret=TimedCall(__func, __time, __iters, __size);\
+	if (__ret==KErrNone)\
+		{\
+		test.Printf(_L("  %dMb %d times ... %d ms\n"),__size, __iters,__time);\
+		}\
+	else if (tempSize < 7)\
+		{\
+		test(__ret==KErrNone);\
+		}
+
+#define DO_TEST_GOB(__ret, __func, __time, __iters, __size, __rem,__taken)\
+	tempSize = __size;\
+	__ret = gobbler.Open();\
+	test(__ret==KErrNone);\
+	/* gobble leaving x+1MB then test adjusting to x...*/\
+	__taken = gobbler.GobbleRAM(__rem*1024*1024);\
+	test.Printf(_L("Gobbled: %dK freeRam %dK\n"), __taken/1024, FreeRam()/1024);\
+	/* adjust to 1MB*/\
+	__ret=TimedCall(__func, __time, __iters, __size);\
+	if (__ret==KErrNone)\
+		{\
+		test.Printf(_L(" %dMb %d times ... %d ms\n"),__size, __iters,__time);\
+		}\
+	else if (tempSize < 7)\
+		{\
+		test(__ret==KErrNone);\
+		}\
+	gobbler.Close();
+	
+
+GLDEF_C TInt E32Main()
+	{
+
+	test.Title();
+	if (!HaveVirtMem())
+		{
+		test.Printf(_L("This test requires an MMU\n"));
+		return KErrNone;
+		}
+	test.Start(_L("Timing MMU allocation/deallocation..."));
+
+	test(KErrNone==MemoryTest.Open());
+
+	TInt r;
+	TUint32 t;
+	TUint32 tempSize;
+	r=TheChunk.CreateLocal(0,0x01000000);
+	test(r==KErrNone);
+
+	test.Printf(_L("Adjusting Chunks\n"));
+	DO_TEST(r, AdjustChunk, t, 100, 1);
+	DO_TEST(r, AdjustChunk, t, 100, 2);
+	DO_TEST(r, AdjustChunk, t, 100, 7);
+	r=TimedCall(AllocateChunk,t,1,7);
+	if (r==KErrNone)
+		{
+		test.Printf(_L("Allocate 7Mb once ... %d ms\n"),t);
+		r=TimedCall(DeallocateChunk,t, 1, 0);
+		test.Printf(_L("Deallocate 7Mb once ... %d ms\n"),t);
+		}
+	else
+		{
+		test.Printf(_L("Alloc chunk 7Mb failed! %d\n"), r);
+		}
+	
+	test.Next(_L("Test physical memory allocations...."));
+
+	DO_TEST(r, AllocPhysical, t, 100, 1);
+	DO_TEST(r, AllocPhysical1, t, 100, 1);
+	DO_TEST(r, AllocPhysical, t, 100, 2);
+	DO_TEST(r, AllocPhysical1, t, 100, 2);
+	DO_TEST(r, AllocPhysical, t, 100, 7);
+	DO_TEST(r, AllocPhysical1, t, 100, 7);
+
+	test.Next(_L("Now the test with low memory...."));
+
+	r = User::LoadLogicalDevice(KGobblerLddFileName);
+	test(r==KErrNone || r==KErrAlreadyExists);
+
+	RGobbler gobbler;
+	TUint32 taken = 0;
+
+	DO_TEST_GOB(r, AdjustChunk, t, 100, 1, 2, taken);
+	DO_TEST_GOB(r, AdjustChunk, t, 100, 2, 3, taken);
+	DO_TEST_GOB(r, AdjustChunk, t, 100, 7, 8, taken);
+
+	r=TimedCall(AllocateChunk,t,1,7);
+	if (r==KErrNone)
+		{
+		test.Printf(_L("Allocate 7Mb once ... %d ms\n"),t);
+		r=TimedCall(DeallocateChunk,t, 1, 0);
+		test.Printf(_L("Deallocate 7Mb once ... %d ms\n"),t);
+		}
+
+	// gobble leaving 8MB then test allocing 7...
+	r = gobbler.Open();
+	test(r==KErrNone);
+	taken = gobbler.GobbleRAM(8*1024*1024);
+	test.Printf(_L("Gobbled: %dK freeRam %dK\n"), taken/1024, FreeRam()/1024);
+	// allocate 7mb
+	r=TimedCall(AllocateChunk,t,1,7);
+	if (r==KErrNone)
+		{
+		test.Printf(_L("Allocate 7Mb once ... %d ms\n"),t);
+		r=TimedCall(DeallocateChunk,t, 1, 0);
+		test.Printf(_L("Deallocate 7Mb once ... %d ms\n"),t);
+		}
+	else
+		test.Printf(_L("Alloc chunk 7Mb failed! %d\n"), r);
+	gobbler.Close();
+
+	test.Next(_L("Test physical memory allocations with low memory...."));
+	DO_TEST_GOB(r, AllocPhysical, t, 100, 1, 2, taken);
+	DO_TEST_GOB(r, AllocPhysical1, t, 100, 1, 2, taken);
+	DO_TEST_GOB(r, AllocPhysical, t, 100, 2, 3, taken);
+	DO_TEST_GOB(r, AllocPhysical1, t, 100, 2, 3, taken);
+	DO_TEST_GOB(r, AllocPhysical, t, 100, 7, 8, taken);
+	DO_TEST_GOB(r, AllocPhysical1, t, 100, 7, 8, taken);
+
+	test.End();
+	return 0;
+	}