diff -r 000000000000 -r a41df078684a kerneltest/e32test/prime/t_mutex.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/prime/t_mutex.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,139 @@ +// 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\prime\t_mutex.cpp +// Test mutexes +// +// + +#include +#include "u32std.h" +#include "../misc/prbs.h" + +RTest test(_L("T_MUTEX")); + +TInt Count1=0; +TInt Count2=0; +TInt TId=-1; +RMutex Mutex; + +void BusyWait(TInt aMicroseconds) + { + TTime begin; + begin.HomeTime(); + FOREVER + { + TTime now; + now.HomeTime(); + TTimeIntervalMicroSeconds iv=now.MicroSecondsFrom(begin); + if (iv.Int64()>=TInt64(aMicroseconds)) + return; + } + } + +TInt ThreadFunction(TAny* aPtr) + { + TInt id=(TInt)aPtr; + FOREVER + { + Mutex.Wait(); + TId=id; + if (Count1!=Count2) + { + RProcess me; + me.Panic(_L("FAIL!"),0); + } + ++Count1; + BusyWait(50000); + ++Count2; + TId=-1; + Mutex.Signal(); + } + } + +void CreateThread(RThread& t, TInt aId) + { + TInt r=t.Create(KNullDesC,ThreadFunction,0x2000,NULL,(TAny*)aId); + test(r==KErrNone); + t.Resume(); + } + + +GLDEF_C TInt E32Main() + { + test.Title(); + test.Start(_L("Create mutex")); + TInt r=Mutex.CreateLocal(); + test(r==KErrNone); + + test.Next(_L("Create threads")); + RThread().SetPriority(EPriorityMuchMore); + RThread t[4]; + TInt i; + for (i=0; i<4; ++i) + CreateThread(t[i],i); + + TUint seed[2]; + seed[0]=0xb17217f8; + seed[1]=0; + + FOREVER + { + TUint ms=Random(seed); + TUint action=(ms>>30); + i=(ms>>28)&3; + ms&=63; + ms+=15; + User::AfterHighRes(ms*1000); + switch(action) + { + case 0: + { + t[i].Suspend(); + break; + } + case 1: + { + t[i].Resume(); + break; + } + case 2: + { + TRequestStatus s; + t[i].Logon(s); + t[i].Kill(0); + if (Count1!=Count2) + { + if (Count1-Count2!=1) + { + RProcess me; + me.Panic(_L("FAIL!"),1); + } + else if (TId==i) + ++Count2; + } + User::AfterHighRes(50000); + User::WaitForRequest(s); + t[i].Close(); + CreateThread(t[i],i); + break; + } + case 3: + { + break; + } + } + } + +// test.End(); + }