diff -r c734af59ce98 -r 5b5d147c7838 kerneltest/e32test/prime/t_semutx.cpp --- a/kerneltest/e32test/prime/t_semutx.cpp Tue May 11 17:28:22 2010 +0300 +++ b/kerneltest/e32test/prime/t_semutx.cpp Tue May 25 14:09:55 2010 +0300 @@ -38,7 +38,10 @@ // // +#define __E32TEST_EXTENSION__ #include +#include +#include const TInt KMaxBufferSize=10; const TInt KMaxArraySize=10; @@ -221,7 +224,7 @@ void StartWaitSemThread(RThread& aT, SWaitSem& aW, TThreadPriority aP=EPriorityLess) { TInt r = aT.Create(KNullDesC, &WaitSemThread, 0x1000, 0x1000, 0x1000, &aW); - test(r==KErrNone); + test_KErrNone(r); aT.SetPriority(aP); aT.Resume(); } @@ -231,9 +234,9 @@ TRequestStatus s; aT.Logon(s); User::WaitForRequest(s); - test(aT.ExitType()==EExitKill); - test(aT.ExitReason()==aResult); - test(s.Int()==aResult); + test_Equal(EExitKill, aT.ExitType()); + test_Equal(aResult, aT.ExitReason()); + test_Equal(aResult, s.Int()); CLOSE_AND_WAIT(aT); } @@ -251,7 +254,7 @@ TTime final; TInt elapsed=0; TInt r = ws.iSem.CreateLocal(0); - test(r==KErrNone); + test_KErrNone(r); RThread().SetPriority(EPriorityAbsoluteVeryLow); TInt threadcount=0; @@ -259,7 +262,7 @@ while (elapsed<1000000) { r = t.Create(KNullDesC, &DummyThread, 0x1000, NULL, NULL); - test(r==KErrNone); + test_KErrNone(r); t.SetPriority(EPriorityMore); t.Resume(); t.Close(); @@ -307,7 +310,7 @@ User::After(200000); t.Resume(); WaitForWaitSemThread(t, KErrTimedOut); - test(ws.iSem.Wait(1)==KErrNone); + test_KErrNone(ws.iSem.Wait(1)); ws.iTimeout=100000; StartWaitSemThread(t, ws, EPriorityMore); @@ -316,7 +319,7 @@ User::After(50000); t.Resume(); WaitForWaitSemThread(t, KErrNone); - test(ws.iSem.Wait(1)==KErrTimedOut); + test_Equal(KErrTimedOut, ws.iSem.Wait(1)); RThread t2; ws.iTimeout=100000; @@ -324,12 +327,12 @@ StartWaitSemThread(t2, ws, EPriorityMore); t.Suspend(); ws.iSem.Signal(); - test(t2.ExitType()==EExitKill); - test(t.ExitType()==EExitPending); + test_Equal(EExitKill, t2.ExitType()); + test_Equal(EExitPending, t.ExitType()); t.Resume(); WaitForWaitSemThread(t, KErrTimedOut); WaitForWaitSemThread(t2, KErrNone); - test(ws.iSem.Wait(1)==KErrTimedOut); + test_Equal(KErrTimedOut, ws.iSem.Wait(1)); ws.iTimeout=1000000; initial.HomeTime(); @@ -376,11 +379,11 @@ initial.HomeTime(); StartWaitSemThread(t, ws, EPriorityMore); StartWaitSemThread(t2, ws, EPriorityMuchMore); - test(t.ExitType()==EExitPending); - test(t2.ExitType()==EExitPending); + test_Equal(EExitPending, t.ExitType()); + test_Equal(EExitPending, t2.ExitType()); ws.iSem.Close(); - test(t.ExitType()==EExitKill); - test(t2.ExitType()==EExitKill); + test_Equal(EExitKill, t.ExitType()); + test_Equal(EExitKill, t2.ExitType()); WaitForWaitSemThread(t2, KErrGeneral); WaitForWaitSemThread(t, KErrGeneral); final.HomeTime(); @@ -414,23 +417,23 @@ test.Next(_L("Producer/Consumer scenario")); // Test Rsemaphore with the producer/consumer scenario RThread thread1, thread2; TRequestStatus stat1, stat2; - test(mutex.CreateLocal()==KErrNone); - test(slotAvailable.CreateLocal(KMaxBufferSize)==KErrNone); - test(itemAvailable.CreateLocal(0)==KErrNone); - test(thread1.Create(_L("Thread1"),Producer,KDefaultStackSize,0x200,0x200,NULL)==KErrNone); - test(thread2.Create(_L("Thread2"),Consumer,KDefaultStackSize,0x200,0x200,NULL)==KErrNone); + test_KErrNone(mutex.CreateLocal()); + test_KErrNone(slotAvailable.CreateLocal(KMaxBufferSize)); + test_KErrNone(itemAvailable.CreateLocal(0)); + test_KErrNone(thread1.Create(_L("Thread1"),Producer,KDefaultStackSize,0x200,0x200,NULL)); + test_KErrNone(thread2.Create(_L("Thread2"),Consumer,KDefaultStackSize,0x200,0x200,NULL)); thread1.Logon(stat1); thread2.Logon(stat2); - test(stat1==KRequestPending); - test(stat2==KRequestPending); + test_Equal(KRequestPending, stat1.Int()); + test_Equal(KRequestPending, stat2.Int()); thread1.Resume(); thread2.Resume(); User::WaitForRequest(stat1); User::WaitForRequest(stat2); - test(stat1==KErrNone); - test(stat2==KErrNone); + test_KErrNone(stat1.Int()); + test_KErrNone(stat2.Int()); for(TInt jj=0;jj>1)); + test_Equal(thread1Count, thread1ActualCount); + test_Equal(thread2Count, thread2ActualCount); + test_Equal(thread2Count, thread1Count); + test_Equal((KMaxArraySize>>1), thread1Count); test.Next(_L("Close")); CLOSE_AND_WAIT(thread1); @@ -521,7 +524,7 @@ { test.Start(_L("Create")); - test(criticalSn.CreateLocal()==KErrNone); + test_KErrNone(criticalSn.CreateLocal()); /***************** TO DO *********************** @@ -551,19 +554,19 @@ // arrayIndex=0; RThread thread1,thread2; - test(thread1.Create(_L("Thread1"),CriticalSnThreadEntryPoint1,KDefaultStackSize,0x2000,0x2000,NULL)==KErrNone); - test(thread2.Create(_L("Thread2"),CriticalSnThreadEntryPoint2,KDefaultStackSize,0x2000,0x2000,NULL)==KErrNone); + test_KErrNone(thread1.Create(_L("Thread1"),CriticalSnThreadEntryPoint1,KDefaultStackSize,0x2000,0x2000,NULL)); + test_KErrNone(thread2.Create(_L("Thread2"),CriticalSnThreadEntryPoint2,KDefaultStackSize,0x2000,0x2000,NULL)); TRequestStatus stat1,stat2; thread1.Logon(stat1); thread2.Logon(stat2); - test(stat1==KRequestPending); - test(stat2==KRequestPending); + test_Equal(KRequestPending, stat1.Int()); + test_Equal(KRequestPending, stat2.Int()); thread1.Resume(); thread2.Resume(); User::WaitForRequest(stat1); User::WaitForRequest(stat2); - test(stat1==KErrNone); - test(stat2==KErrNone); + test_KErrNone(stat1.Int()); + test_KErrNone(stat2.Int()); TInt thread1ActualCount=0; TInt thread2ActualCount=0; TInt ii=0; @@ -575,10 +578,10 @@ thread2ActualCount++; ii++; } - test(thread1ActualCount==thread1Count); - test(thread2ActualCount==thread2Count); - test(thread1Count==thread2Count); - test(thread1Count==(KMaxArraySize>>1)); + test_Equal(thread1Count, thread1ActualCount); + test_Equal(thread2Count, thread2ActualCount); + test_Equal(thread2Count, thread1Count); + test_Equal((KMaxArraySize>>1), thread1Count); test.Next(_L("Close")); CLOSE_AND_WAIT(thread1); @@ -590,6 +593,16 @@ GLDEF_C TInt E32Main() { + TInt cpus = UserSvr::HalFunction(EHalGroupKernel, EKernelHalNumLogicalCpus, 0, 0); + if (cpus != 1) + { + test(cpus>1); + // This test will require compatibility mode (and probably other changes) + // to work on SMP - it depends on explicit scheduling order. + test.Printf(_L("T_SEMUTX skipped, does not work on SMP\n")); + return KErrNone; + } + test.Title(); __UHEAP_MARK;