void FMTest1P() { TEST_PRINT("Testing priority change"); if (NKern::NumberOfCpus()==1) return; NFastSemaphore exitSem(0); SFMTest1Info* pI = new SFMTest1Info; TEST_OOM(pI); memclr(pI, sizeof(SFMTest1Info)); TEST_PRINT1("Info@0x%08x", pI); pI->iBlockSize = 256; pI->iBlock = (TUint32*)malloc(pI->iBlockSize*sizeof(TUint32)); TEST_OOM(pI->iBlock); pI->iPriorityThreshold = 9; pI->iBlock[0] = 0; setup_block((TUint32*)pI->iBlock, pI->iBlockSize); pI->iStop = FALSE; TInt cpu; TInt threadCount = 0; TInt pri = 9; char name[16] = "FMTest1P.0"; for_each_cpu(cpu) { name[9] = (char)(threadCount + '0'); if (cpu==1) pI->iThreads[threadCount] = CreateThreadSignalOnExit("FMTest1PInterferer", &FMTest1PInterfererThread, 12, pI, 0, KSmallTimeslice, &exitSem, 1); else pI->iThreads[threadCount] = CreateThreadSignalOnExit(name, &FMTest1Thread, pri, pI, 0, KSmallTimeslice, &exitSem, cpu); pri = 10; threadCount++; } TUint32 b0 = 0xffffffffu; FOREVER { NKern::Sleep(1000); TUint32 b = pI->iBlock[0]; TEST_PRINT1("%d", b); if (b > 1048576) { pI->iStop = TRUE; break; } if (b == b0) { __crash(); } b0 = b; } while (threadCount--) NKern::FSWait(&exitSem); TEST_PRINT1("Total iterations %d", pI->iBlock[0]); free((TAny*)pI->iBlock); free(pI); }
void FSTest2(TAny* a) { SFSTest2Info& info = *(SFSTest2Info*)a; NFastSemaphore exitSem(0); NKern::FSSetOwner(&info.iSem, 0); info.iBlockCount = 0; info.iWaits = 0; info.iSignals = 0; info.iStart = FALSE; info.iStop = FALSE; TInt cpu; TInt threads = 0; TInt this_cpu = NKern::CurrentCpu(); for_each_cpu(cpu) { if (cpu==this_cpu) CreateThreadSignalOnExit("FSTest2Sig0", &FSTest2Signaller0, 11, a, 0, KSmallTimeslice, &exitSem, cpu); else CreateThreadSignalOnExit("FSTest2Sig", &FSTest2Signaller, 12, a, 0, KSmallTimeslice, &exitSem, cpu); ++threads; } info.iStart = TRUE; while(info.iWaits < 1048576) { NKern::FSWait(&info.iSem); ++info.iWaits; } info.iStop = TRUE; while (threads--) NKern::FSWait(&exitSem); TEST_PRINT1("Leftover signals %d", info.iSignals-info.iWaits); TInt r; do { r = WaitWithTimeout(&info.iSem, KMinTimeout); TEST_RESULT1(r==KErrNone || r==KErrTimedOut, "Invalid return code %d", r); if (r == KErrNone) ++info.iWaits; } while(r == KErrNone); TEST_PRINT2("Signalled %d, Waited %d", info.iSignals, info.iWaits); TEST_RESULT(info.iWaits==info.iSignals, "MISMATCH!"); }
void FMTest1() { TEST_PRINT("Testing mutual exclusion"); NFastSemaphore exitSem(0); SFMTest1Info* pI = new SFMTest1Info; TEST_OOM(pI); memclr(pI, sizeof(SFMTest1Info)); pI->iBlockSize = 256; pI->iBlock = (TUint32*)malloc(pI->iBlockSize*sizeof(TUint32)); TEST_OOM(pI->iBlock); pI->iPriorityThreshold = 10; pI->iBlock[0] = 0; setup_block((TUint32*)pI->iBlock, pI->iBlockSize); pI->iStop = FALSE; TInt cpu; TInt threads = 0; for_each_cpu(cpu) { CreateThreadSignalOnExit("FMTest1H", &FMTest1Thread, 11, pI, 0, KSmallTimeslice, &exitSem, cpu); CreateThreadSignalOnExit("FMTest1L0", &FMTest1Thread, 10, pI, 0, KSmallTimeslice, &exitSem, cpu); CreateThreadSignalOnExit("FMTest1L1", &FMTest1Thread, 10, pI, 0, KSmallTimeslice, &exitSem, cpu); threads += 3; } FOREVER { NKern::Sleep(1000); TEST_PRINT1("%d", pI->iBlock[0]); if (pI->iBlock[0] > 65536) { pI->iStop = TRUE; break; } } while (threads--) NKern::FSWait(&exitSem); TEST_PRINT1("Total iterations %d", pI->iBlock[0]); free((TAny*)pI->iBlock); free(pI); }