diff -r 000000000000 -r a41df078684a kerneltest/e32test/bench/t_ipcbm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/bench/t_ipcbm.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,143 @@ +// Copyright (c) 1998-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_ipcbm.cpp +// Overview: +// Test and benchmark the data copy in inter-process communication. +// API Information: +// RServer2, RSessionBase +// Details: +// - Create a server thread and write data blocks of varying sizes from the +// server to client, increment a count after each write. +// - Create a client session, connect to server and send data block size +// to the server. +// - Print the block size, total number of bytes written along with usec +// per block. +// - Verify that the heap was not corrupted by any of the tests. +// Platforms/Drives/Compatibility: +// All. +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include +#include + +LOCAL_D RTest test(_L("T_IPCBM")); + +const TInt KBufferSize = 65536; + +LOCAL_D TUint32* Src; +LOCAL_D TUint32* Dest; +LOCAL_D TInt Count=0; +LOCAL_D RServer2 Server; +LOCAL_D RSemaphore ServerSem; + + +class RMySession : public RSessionBase + { +public: + TInt Connect(RServer2 aSrv,TRequestStatus& aStat) + {return CreateSession(aSrv,TVersion(),1,EIpcSession_Unsharable,0,&aStat);} + void Test(TDes8& aDes) + {Send(0,TIpcArgs(&aDes));} + }; + +LOCAL_C TInt TestThread(TAny* aSize) + { + TInt r = Server.CreateGlobal(KNullDesC); + ServerSem.Signal(); + if (r != KErrNone) + return r; + + RMessage2 m; + Server.Receive(m); + m.Complete(KErrNone); // connect message + + Server.Receive(m); + TInt size=(TInt)aSize; + TPtrC8 src((const TUint8*)Src,size); + FOREVER + { + m.Write(0,src); + Count++; + } + } + +const TInt KTestRunSeconds = 10; + +LOCAL_C void RunTest(TInt aSize) + { + const TInt KTestRunUs = KTestRunSeconds * 1000000; + + RThread t; + TInt r=t.Create(KNullDesC,TestThread,0x1000,NULL,(TAny*)aSize); + test(r==KErrNone); + t.SetPriority(EPriorityLess); + TRequestStatus s; + t.Logon(s); + t.Resume(); + ServerSem.Wait(); + test(Server.Handle() != KNullHandle); + + RMySession sess; + TRequestStatus stat; + test(sess.Connect(Server,stat) == KErrNone); + User::WaitForRequest(stat); // connected + + Count=0; + TPtr8 des((TUint8*)Dest, 0, aSize); + sess.Test(des); + User::After(KTestRunUs); + t.Kill(0); + User::WaitForRequest(s); + sess.Close(); + Server.Close(); + CLOSE_AND_WAIT(t); + + TInt us=10*KTestRunUs/Count; + test.Printf(_L("%5d byte writes: %8d/%ds %4d.%01dus\n"),aSize,Count,KTestRunSeconds,us/10,us%10); + } + +GLDEF_C TInt E32Main() + { + test.Title(); + test.Start(_L("Benchmark IPC copy")); + + __KHEAP_MARK; + + TAny* buffer = User::Alloc(2 * KBufferSize + 32); + test(buffer != 0); + + Src = (TUint32*)((((TInt)buffer) & ~0x1f) + 0x20); + Dest = (TUint32*)(((TInt)Src) + KBufferSize); + + test(ServerSem.CreateLocal(0) == KErrNone); + + static TInt KMaxCounts[] = { 16, 256, 512, 2048, 2052, 4096, 32768, 65536 }; + for (TUint i=0; i