diff options
author | Arne H Juul <arnej@yahoo-inc.com> | 2016-06-29 15:21:51 +0200 |
---|---|---|
committer | Arne H Juul <arnej@yahoo-inc.com> | 2016-06-29 16:16:57 +0200 |
commit | 9f9ed5453b45c1fba47bcd4e83cf8b36afddb95a (patch) | |
tree | f209518821a795a66aceccdcedeef8a13561db9f /fastos/src/tests/threadtest.cpp | |
parent | 07e47f92d879cc1b7d0eb89ef8170d5366904dc7 (diff) |
split test so it can run in parallel
Diffstat (limited to 'fastos/src/tests/threadtest.cpp')
-rw-r--r-- | fastos/src/tests/threadtest.cpp | 452 |
1 files changed, 3 insertions, 449 deletions
diff --git a/fastos/src/tests/threadtest.cpp b/fastos/src/tests/threadtest.cpp index ed39f8df189..88254108557 100644 --- a/fastos/src/tests/threadtest.cpp +++ b/fastos/src/tests/threadtest.cpp @@ -124,106 +124,7 @@ public: Progress(true, "Threads finished"); } - void MutexTest (bool usingMutex) - { - if(usingMutex) - TestHeader("Mutex Test"); - else - TestHeader("Not Using Mutex Test"); - - - FastOS_ThreadPool *pool = new FastOS_ThreadPool(128*1024, MAX_THREADS); - - if(Progress(pool != NULL, "Allocating ThreadPool")) - { - int i; - Job jobs[MUTEX_TEST_THREADS]; - FastOS_Mutex *myMutex=NULL; - - if(usingMutex) - myMutex = new FastOS_Mutex(); - - for(i=0; i<MUTEX_TEST_THREADS; i++) - { - jobs[i].code = INCREASE_NUMBER; - jobs[i].mutex = myMutex; - } - - number = 0; - - for(i=0; i<MUTEX_TEST_THREADS; i++) - { - bool rc = (NULL != pool->NewThread(this, - static_cast<void *>(&jobs[i]))); - Progress(rc, "Creating Thread with%s mutex", (usingMutex ? "" : "out")); - }; - - WaitForThreadsToFinish(jobs, MUTEX_TEST_THREADS); - - - for(i=0; i<MUTEX_TEST_THREADS; i++) - { - Progress(true, "Thread returned with resultcode %d", jobs[i].result); - } - - bool wasOk=true; - int concurrentHits=0; - - for(i=0; i<MUTEX_TEST_THREADS; i++) - { - int result = jobs[i].result; - - if(usingMutex) - { - if((result % INCREASE_NUMBER_AMOUNT) != 0) - { - wasOk = false; - Progress(false, "Mutex locking did not work (%d).", result); - break; - } - } - else - { - if((result != 0) && - (result != INCREASE_NUMBER_AMOUNT*MUTEX_TEST_THREADS) && - (result % INCREASE_NUMBER_AMOUNT) == 0) - { - if((++concurrentHits) == 2) - { - wasOk = false; - Progress(false, "Very unlikely that threads are running " - "concurrently (%d)", jobs[i].result); - break; - } - } - } - } - - if(wasOk) - { - if(usingMutex) - { - Progress(true, "Using the mutex, the returned numbers were alligned."); - } - else - { - Progress(true, "Returned numbers were not alligned. " - "This was the expected result."); - } - } - - if(myMutex != NULL) - delete(myMutex); - - Progress(true, "Closing threadpool..."); - pool->Close(); - - Progress(true, "Deleting threadpool..."); - delete(pool); - } - PrintSeparator(); - } - + int Main (); void TooManyThreadsTest () { @@ -335,29 +236,6 @@ public: PrintSeparator(); } - void CreateSingleThread () - { - TestHeader("Create Single Thread Test"); - - FastOS_ThreadPool *pool = new FastOS_ThreadPool(128*1024); - - if(Progress(pool != NULL, "Allocating ThreadPool")) - { - bool rc = (NULL != pool->NewThread(this, NULL)); - Progress(rc, "Creating Thread"); - - Progress(true, "Sleeping 3 seconds"); - FastOS_Thread::Sleep(3000); - } - - Progress(true, "Closing threadpool..."); - pool->Close(); - - Progress(true, "Deleting threadpool..."); - delete(pool); - PrintSeparator(); - } - void CreateSingleThreadAndJoin () { TestHeader("Create Single Thread And Join Test"); @@ -522,84 +400,6 @@ public: PrintSeparator(); } - void SingleThreadJoinWaitMultipleTest(int variant) - { - bool rc=false; - - char testName[300]; - - sprintf(testName, "Single Thread Join Wait Multiple Test %d", variant); - TestHeader(testName); - - FastOS_ThreadPool pool(128*1024); - - const int testThreads=5; - int lastThreadNum = testThreads-1; - int i; - - Job jobs[testThreads]; - - FastOS_Mutex jobMutex; - - // The mutex is used to pause the first threads until we have created - // the last one. - jobMutex.Lock(); - - for(i=0; i<lastThreadNum; i++) - { - jobs[i].code = WAIT_FOR_THREAD_TO_FINISH; - jobs[i].mutex = &jobMutex; - jobs[i].ownThread = pool.NewThread(this, - static_cast<void *>(&jobs[i])); - - rc = (jobs[i].ownThread != NULL); - Progress(rc, "Creating Thread %d", i+1); - - if(!rc) - break; - } - - if(rc) - { - jobs[lastThreadNum].code = (((variant & 2) != 0) ? NOP : PRINT_MESSAGE_AND_WAIT3SEC); - jobs[lastThreadNum].message = strdup("This is the thread that others wait for."); - - FastOS_ThreadInterface *lastThread; - - lastThread = pool.NewThread(this, - static_cast<void *> - (&jobs[lastThreadNum])); - - rc = (lastThread != NULL); - Progress(rc, "Creating last thread"); - - if(rc) - { - for(i=0; i<lastThreadNum; i++) - { - jobs[i].otherThread = lastThread; - } - } - } - - jobMutex.Unlock(); - - if((variant & 1) != 0) - { - for(i=0; i<lastThreadNum; i++) - { - Progress(true, "Waiting for thread %d to finish using Join()", i+1); - jobs[i].ownThread->Join(); - Progress(true, "Thread %d finished.", i+1); - } - } - - Progress(true, "Closing pool."); - pool.Close(); - Progress(true, "Pool closed."); - PrintSeparator(); - } - void WaitForXThreadsToHaveWait (Job *jobs, int jobCount, FastOS_Cond *condition, @@ -658,70 +458,6 @@ public: FastOS_Thread::Sleep(1000); } - void BounceTest(void) - { - TestHeader("Bounce Test"); - - FastOS_ThreadPool pool(128 * 1024); - FastOS_Cond cond1; - FastOS_Cond cond2; - Job job1; - Job job2; - FastOS_Time checkTime; - int cnt1; - int cnt2; - int cntsum; - int lastcntsum; - - job1.code = BOUNCE_CONDITIONS; - job2.code = BOUNCE_CONDITIONS; - job1.otherjob = &job2; - job2.otherjob = &job1; - job1.condition = &cond1; - job2.condition = &cond2; - - job1.ownThread = pool.NewThread(this, static_cast<void *>(&job1)); - job2.ownThread = pool.NewThread(this, static_cast<void *>(&job2)); - - lastcntsum = -1; - for (int iter = 0; iter < 8; iter++) { - checkTime.SetNow(); - - int left = static_cast<int>(checkTime.MilliSecsToNow()); - while (left < 1000) { - FastOS_Thread::Sleep(1000 - left); - left = static_cast<int>(checkTime.MilliSecsToNow()); - } - - cond1.Lock(); - cnt1 = job1.bouncewakeupcnt; - cond1.Unlock(); - cond2.Lock(); - cnt2 = job2.bouncewakeupcnt; - cond2.Unlock(); - cntsum = cnt1 + cnt2; - Progress(lastcntsum != cntsum, "%d bounces", cntsum); - lastcntsum = cntsum; - } - - job1.ownThread->SetBreakFlag(); - cond1.Lock(); - job1.bouncewakeup = true; - cond1.Signal(); - cond1.Unlock(); - - job2.ownThread->SetBreakFlag(); - cond2.Lock(); - job2.bouncewakeup = true; - cond2.Signal(); - cond2.Unlock(); - - pool.Close(); - Progress(true, "Pool closed."); - PrintSeparator(); - - } - void SignalTest () { const int numThreads = 5; @@ -857,171 +593,6 @@ public: PrintSeparator(); } - void TryLockTest () - { - TestHeader("Mutex TryLock Test"); - - FastOS_ThreadPool pool(128*1024); - Job job; - FastOS_Mutex mtx; - - job.code = HOLD_MUTEX_FOR2SEC; - job.result = -1; - job.mutex = &mtx; - job.ownThread = pool.NewThread(this, - static_cast<void *>(&job)); - - Progress(job.ownThread !=NULL, "Creating thread"); - - if(job.ownThread != NULL) - { - bool lockrc; - - FastOS_Thread::Sleep(1000); - - for(int i=0; i<5; i++) - { - lockrc = mtx.TryLock(); - Progress(!lockrc, "We should not get the mutex lock just yet (%s)", - lockrc ? "got it" : "didn't get it"); - if(lockrc) { - mtx.Unlock(); - break; - } - } - - FastOS_Thread::Sleep(2000); - - lockrc = mtx.TryLock(); - Progress(lockrc, "We should get the mutex lock now (%s)", - lockrc ? "got it" : "didn't get it"); - - if(lockrc) - mtx.Unlock(); - - Progress(true, "Attempting to do normal lock..."); - mtx.Lock(); - Progress(true, "Got lock. Attempt to do normal unlock..."); - mtx.Unlock(); - Progress(true, "Unlock OK."); - } - - Progress(true, "Waiting for threads to finish using pool.Close()..."); - pool.Close(); - Progress(true, "Pool closed."); - - PrintSeparator(); - } - - void ThreadStatsTest () - { - int inactiveThreads; - int activeThreads; - int startedThreads; - - TestHeader("Thread Statistics Test"); - - FastOS_ThreadPool pool(128*1024); - Job job[2]; - - inactiveThreads = pool.GetNumInactiveThreads(); - Progress(inactiveThreads == 0, "Initial inactive threads = %d", - inactiveThreads); - activeThreads = pool.GetNumActiveThreads(); - Progress(activeThreads == 0, "Initial active threads = %d", - activeThreads); - startedThreads = pool.GetNumStartedThreads(); - Progress(startedThreads == 0, "Initial started threads = %d", - startedThreads); - - job[0].code = WAIT_FOR_BREAK_FLAG; - job[0].ownThread = pool.NewThread(this, - static_cast<void *>(&job[0])); - - FastOS_Thread::Sleep(1000); - - inactiveThreads = pool.GetNumInactiveThreads(); - Progress(inactiveThreads == 0, "Inactive threads = %d", inactiveThreads); - activeThreads = pool.GetNumActiveThreads(); - Progress(activeThreads == 1, "Active threads = %d", activeThreads); - startedThreads = pool.GetNumStartedThreads(); - Progress(startedThreads == 1, "Started threads = %d", startedThreads); - - job[1].code = WAIT_FOR_BREAK_FLAG; - job[1].ownThread = pool.NewThread(this, - static_cast<void *>(&job[1])); - - FastOS_Thread::Sleep(1000); - - inactiveThreads = pool.GetNumInactiveThreads(); - Progress(inactiveThreads == 0, "Inactive threads = %d", inactiveThreads); - activeThreads = pool.GetNumActiveThreads(); - Progress(activeThreads == 2, "Active threads = %d", activeThreads); - startedThreads = pool.GetNumStartedThreads(); - Progress(startedThreads == 2, "Started threads = %d", startedThreads); - - Progress(true, "Setting breakflag on threads..."); - job[0].ownThread->SetBreakFlag(); - job[1].ownThread->SetBreakFlag(); - - FastOS_Thread::Sleep(3000); - - inactiveThreads = pool.GetNumInactiveThreads(); - Progress(inactiveThreads == 2, "Inactive threads = %d", inactiveThreads); - activeThreads = pool.GetNumActiveThreads(); - Progress(activeThreads == 0, "Active threads = %d", activeThreads); - startedThreads = pool.GetNumStartedThreads(); - Progress(startedThreads == 2, "Started threads = %d", startedThreads); - - - Progress(true, "Repeating process in the same pool..."); - - job[0].code = WAIT_FOR_BREAK_FLAG; - job[0].ownThread = pool.NewThread(this, static_cast<void *>(&job[0])); - - FastOS_Thread::Sleep(1000); - - inactiveThreads = pool.GetNumInactiveThreads(); - Progress(inactiveThreads == 1, "Inactive threads = %d", inactiveThreads); - activeThreads = pool.GetNumActiveThreads(); - Progress(activeThreads == 1, "Active threads = %d", activeThreads); - startedThreads = pool.GetNumStartedThreads(); - Progress(startedThreads == 3, "Started threads = %d", startedThreads); - - job[1].code = WAIT_FOR_BREAK_FLAG; - job[1].ownThread = pool.NewThread(this, static_cast<void *>(&job[1])); - - FastOS_Thread::Sleep(1000); - - inactiveThreads = pool.GetNumInactiveThreads(); - Progress(inactiveThreads == 0, "Inactive threads = %d", inactiveThreads); - activeThreads = pool.GetNumActiveThreads(); - Progress(activeThreads == 2, "Active threads = %d", activeThreads); - startedThreads = pool.GetNumStartedThreads(); - Progress(startedThreads == 4, "Started threads = %d", startedThreads); - - Progress(true, "Setting breakflag on threads..."); - job[0].ownThread->SetBreakFlag(); - job[1].ownThread->SetBreakFlag(); - - FastOS_Thread::Sleep(3000); - - inactiveThreads = pool.GetNumInactiveThreads(); - Progress(inactiveThreads == 2, "Inactive threads = %d", inactiveThreads); - activeThreads = pool.GetNumActiveThreads(); - Progress(activeThreads == 0, "Active threads = %d", activeThreads); - startedThreads = pool.GetNumStartedThreads(); - Progress(startedThreads == 4, "Started threads = %d", startedThreads); - - - pool.Close(); - Progress(true, "Pool closed."); - - PrintSeparator(); - } - - int Main (); - void LeakTest () { TestHeader("Leak Test"); @@ -1111,42 +682,25 @@ public: int ThreadTest::Main () { printf("grep for the string '%s' to detect failures.\n\n", failString); + time_t before = time(0); // HowManyThreadsTest(); SynchronizationStressTest(); LeakTest(); - ThreadStatsTest(); - TryLockTest(); TimedWaitTest(); ThreadIdTest(); SignalTest(); BroadcastTest(); - CreateSingleThread(); CreateSingleThreadAndJoin(); TooManyThreadsTest(); - MutexTest(false); - MutexTest(true); ClosePoolTest(); BreakFlagTest(); - SingleThreadJoinWaitMultipleTest(0); - SingleThreadJoinWaitMultipleTest(1); - SingleThreadJoinWaitMultipleTest(2); - SingleThreadJoinWaitMultipleTest(3); - SingleThreadJoinWaitMultipleTest(2); - SingleThreadJoinWaitMultipleTest(1); - SingleThreadJoinWaitMultipleTest(0); - BreakFlagTest(); - ClosePoolTest(); - MutexTest(true); - MutexTest(false); - TooManyThreadsTest(); CreateSingleThreadAndJoin(); - CreateSingleThread(); BroadcastTest(); SignalTest(); ThreadCreatePerformance(false, 500, 100); ClosePoolStability(); - BounceTest(); + { time_t now = time(0); printf("[%ld seconds]\n", now-before); before = now; } printf("END OF TEST (%s)\n", _argv[0]); |