diff -r 95f71bcdcdb7 -r 657f875b013e kerneltest/e32test/prime/t_semutx2.cpp --- a/kerneltest/e32test/prime/t_semutx2.cpp Thu May 27 14:17:14 2010 +0300 +++ b/kerneltest/e32test/prime/t_semutx2.cpp Fri Jun 11 15:02:23 2010 +0300 @@ -37,7 +37,10 @@ // // +#define __E32TEST_EXTENSION__ #include +#include +#include RMutex M1; RMutex M2; @@ -62,8 +65,8 @@ //#define MCOUNT(m,c) test((m).Count() ==(c)) // mutex count value is not visible for user any more #define MCOUNT(m,c) (void)(1) -#define IDCHECK(x) test(GetNextId()==(x)) -#define NUMCHECK(x) test(NumIdsPending()==(x)) +#define IDCHECK(x) test_Equal((x), GetNextId()) +#define NUMCHECK(x) test_Equal((x), NumIdsPending()) #define id0 id[0] #define id1 id[1] @@ -153,38 +156,38 @@ TInt count=0; TRequestStatus s; TInt r=t.Create(_L("Test0"),Test0Thread,0x1000,NULL,&count); - test(r==KErrNone); + test_KErrNone(r); t.Logon(s); - test(r==KErrNone); + test_KErrNone(r); User::After(10000); // make sure we have a full timeslice t.Resume(); - test(count==0); // t shouldn't have run yet + test_Equal(0, count); // t shouldn't have run yet RThread().SetPriority(EPriorityMuchMore); // shouldn't reschedule (priority unchanged) - test(count==0); + test_Equal(0, count); RThread().SetPriority(EPriorityMore); // shouldn't reschedule (priority decreasing, but not enough) - test(count==0); + test_Equal(0, count); RThread().SetPriority(EPriorityMuchMore); // shouldn't reschedule (priority increasing) - test(count==0); + test_Equal(0, count); RThread().SetPriority(EPriorityNormal); // should reschedule (we go behind t) - test(count==1); + test_Equal(1, count); RThread().SetPriority(EPriorityLess); // should reschedule (priority decreasing to below t) - test(count==2); + test_Equal(2, count); t.SetPriority(EPriorityMuchMore); // shouldn't reschedule (round-robin, timeslice not expired) - test(count==2); + test_Equal(2, count); t.SetPriority(EPriorityNormal); // shouldn't reschedule (t's priority decreasing) - test(count==2); + test_Equal(2, count); t.SetPriority(EPriorityNormal); // shouldn't reschedule (t's priority unchanged) - test(count==2); + test_Equal(2, count); BusyWait(100000); // use up our timeslice t.SetPriority(EPriorityMuchMore); // should reschedule (round-robin, timeslice expired) - test(count==3); - test(s==KRequestPending); - test(t.ExitType()==EExitPending); + test_Equal(3, count); + test_Equal(KRequestPending, s.Int()); + test_Equal(EExitPending, t.ExitType()); t.SetPriority(EPriorityRealTime); // should reschedule (t increases above current) - test(count==4); - test(s==KErrNone); // t should have exited - test(t.ExitType()==EExitKill); + test_Equal(4, count); + test_KErrNone(s.Int()); // t should have exited + test_Equal(EExitKill, t.ExitType()); User::WaitForRequest(s); RThread().SetPriority(EPriorityMuchMore); t.Close(); @@ -201,11 +204,11 @@ { test.Start(_L("Test signalling from wrong thread")); TInt r=M1.CreateLocal(); - test(r==KErrNone); + test_KErrNone(r); M1.Wait(); RThread t; r=t.Create(_L("Test1"),Test1Thread,0x1000,NULL,NULL); - test(r==KErrNone); + test_KErrNone(r); TRequestStatus s; t.Logon(s); t.Resume(); @@ -213,9 +216,9 @@ User::SetJustInTime(EFalse); User::WaitForRequest(s); User::SetJustInTime(jit); - test(s==EAccessDenied); - test(t.ExitType()==EExitPanic); - test(t.ExitReason()==EAccessDenied); + test_Equal(EAccessDenied, s.Int()); + test_Equal(EExitPanic, t.ExitType()); + test_Equal(EAccessDenied, t.ExitReason()); test(t.ExitCategory()==_L("KERN-EXEC")); t.Close(); M1.Close(); @@ -273,13 +276,13 @@ test.Next(_L("Create mutex")); TInt r=M1.CreateLocal(); - test(r==KErrNone); + test_KErrNone(r); test.Next(_L("Create low priority thread")); TInt lowcount=0; RThread low; r=low.Create(_L("low"),LowThread,0x1000,NULL,&lowcount); - test(r==KErrNone); + test_KErrNone(r); low.SetPriority(EPriorityMuchLess); test(Exists(_L("low"))); @@ -287,42 +290,42 @@ TInt medcount=0; RThread med; r=med.Create(_L("med"),MedThread,0x1000,NULL,&medcount); - test(r==KErrNone); + test_KErrNone(r); med.SetPriority(EPriorityNormal); test(Exists(_L("med"))); test.Next(_L("Start low priority thread")); low.Resume(); User::AfterHighRes(KTestDelay/10); - test(lowcount==1); + test_Equal(1, lowcount); // MCOUNT(M1,0); test.Next(_L("Start medium priority thread")); med.Resume(); User::AfterHighRes(KTestDelay/10); - test(medcount==1); + test_Equal(1, medcount); Kick(med); User::AfterHighRes(KTestDelay/10); - test(medcount==2); + test_Equal(2, medcount); Kick(med); M1.Wait(); - test(lowcount==1); - test(medcount==2); + test_Equal(1, lowcount); + test_Equal(2, medcount); test.Next(_L("Wait, check medium runs")); User::AfterHighRes(KTestDelay/10); - test(medcount==3); + test_Equal(3, medcount); M1.Signal(); test.Next(_L("Create mutex 2")); r=M2.CreateLocal(); - test(r==KErrNone); + test_KErrNone(r); test.Next(_L("Create high priority thread")); TInt highcount=0; RThread high; r=high.Create(_L("high"),HighThread,0x1000,NULL,&highcount); - test(r==KErrNone); + test_KErrNone(r); high.SetPriority(EPriorityMore); test(Exists(_L("high"))); @@ -336,15 +339,15 @@ User::AfterHighRes(KTestDelay/10); // MCOUNT(M2,0); // MCOUNT(M1,-1); - test(highcount==1); + test_Equal(1, highcount); M2.Wait(); - test(lowcount==2); - test(medcount==3); - test(highcount==2); + test_Equal(2, lowcount); + test_Equal(3, medcount); + test_Equal(2, highcount); test.Next(_L("Wait, check medium runs")); User::AfterHighRes(KTestDelay/10); - test(medcount==4); + test_Equal(4, medcount); M2.Signal(); test.Next(_L("Kill threads")); @@ -401,7 +404,7 @@ TBuf<4> b; b.Num(n); TInt r=t.Create(b,ThreadFunction,0x1000,NULL,aPtr); - test(r==KErrNone); + test_KErrNone(r); t.Resume(); TUint id=t.Id(); test.Printf(_L("id=%d\n"),id); @@ -516,7 +519,7 @@ Count=0; test.Next(_L("Create mutex")); TInt r=M1.CreateLocal(); - test(r==KErrNone); + test_KErrNone(r); MCOUNT(M1,1); MutexWait(); MCOUNT(M1,0); @@ -624,7 +627,7 @@ User::After(50000); // let threads claim mutex MutexWait(); MCOUNT(M1,0); // check no threads waiting - test(t[2].ExitType()==EExitKill); // check t2 has exited + test_Equal(EExitKill, t[2].ExitType()); // check t2 has exited t[2].Close(); test(!Exists(2)); IDCHECK(id2); // check they ran in order t2,t3,t4,t5,t1 @@ -942,12 +945,12 @@ { if (i==3 || i==6 || i==7) { - test(t[i].ExitType()==EExitPending); + test_Equal(EExitPending, t[i].ExitType()); } else { - test(t[i].ExitType()==EExitPanic); - test(t[i].ExitReason()==EBadHandle); + test_Equal(EExitPanic, t[i].ExitType()); + test_Equal(EBadHandle, t[i].ExitReason()); test(t[i].ExitCategory()==_L("KERN-EXEC")); t[i].Close(); test(!Exists(i)); @@ -963,8 +966,8 @@ { if (i==3 || i==6 || i==7) { - test(t[i].ExitType()==EExitPanic); - test(t[i].ExitReason()==EBadHandle); + test_Equal(EExitPanic, t[i].ExitType()); + test_Equal(EBadHandle, t[i].ExitReason()); test(t[i].ExitCategory()==_L("KERN-EXEC")); t[i].Close(); test(!Exists(i)); @@ -1008,11 +1011,11 @@ test.Start(_L("Test mutex speed")); TInt count=0; TInt r=M1.CreateLocal(); - test(r==KErrNone); + test_KErrNone(r); RThread t; r=t.Create(_L("Speed"),MutexSpeed,0x1000,NULL,&count); - test(r==KErrNone); + test_KErrNone(r); t.SetPriority(EPriorityRealTime); t.Resume(); User::AfterHighRes(1000000); @@ -1023,7 +1026,7 @@ TInt count2=0; r=t.Create(_L("Speed2"),MutexSpeed2,0x1000,NULL,&count2); - test(r==KErrNone); + test_KErrNone(r); t.SetPriority(EPriorityRealTime); t.Resume(); User::AfterHighRes(1000000); @@ -1074,7 +1077,7 @@ TBuf<4> b; b.Num(n); TInt r=t.Create(b,SemThreadFunction,0x1000,NULL,aPtr); - test(r==KErrNone); + test_KErrNone(r); t.Resume(); TUint id=t.Id(); return id; @@ -1147,7 +1150,7 @@ Count=0; test.Next(_L("Create semaphore")); TInt r=S.CreateLocal(2); - test(r==KErrNone); + test_KErrNone(r); MCOUNT(S,2); SemWait(); MCOUNT(S,1); @@ -1312,20 +1315,20 @@ { if (i==3 || i==7 || i==10) { - test(t[i].ExitType()==EExitPending); + test_Equal(EExitPending, t[i].ExitType()); } else if (i!=5) { - test(t[i].ExitType()==EExitPanic); - test(t[i].ExitReason()==EBadHandle); + test_Equal(EExitPanic, t[i].ExitType()); + test_Equal(EBadHandle, t[i].ExitReason()); test(t[i].ExitCategory()==_L("KERN-EXEC")); t[i].Close(); test(!Exists(i)); } else { - test(t[i].ExitType()==EExitKill); - test(t[i].ExitReason()==0); + test_Equal(EExitKill, t[i].ExitType()); + test_Equal(0, t[i].ExitReason()); t[i].Close(); test(!Exists(i)); } @@ -1340,8 +1343,8 @@ { if (i==3 || i==7 || i==10) { - test(t[i].ExitType()==EExitPanic); - test(t[i].ExitReason()==EBadHandle); + test_Equal(EExitPanic, t[i].ExitType()); + test_Equal(EBadHandle, t[i].ExitReason()); test(t[i].ExitCategory()==_L("KERN-EXEC")); t[i].Close(); test(!Exists(i)); @@ -1371,11 +1374,11 @@ test.Start(_L("Test semaphore speed")); TInt count=0; TInt r=S.CreateLocal(1); - test(r==KErrNone); + test_KErrNone(r); RThread t; r=t.Create(_L("SemSpeed"),SemSpeed,0x1000,NULL,&count); - test(r==KErrNone); + test_KErrNone(r); t.SetPriority(EPriorityRealTime); t.Resume(); User::AfterHighRes(1000000); @@ -1391,12 +1394,22 @@ 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_SEMUTX2 skipped, does not work on SMP\n")); + return KErrNone; + } + test.Title(); test.Start(_L("Test mutexes and semaphores")); RThread().SetPriority(EPriorityMuchMore); TInt r=Main.Duplicate(RThread()); - test(r==KErrNone); + test_KErrNone(r); Test0(); Test1();