diff options
| author | Gavin Andresen <[email protected]> | 2015-05-16 18:02:46 -0400 |
|---|---|---|
| committer | Gavin Andresen <[email protected]> | 2015-05-16 18:03:26 -0400 |
| commit | 3c60937ce6a251e565e169715ebb2f3dd76825c4 (patch) | |
| tree | 4e0779eebaebe0a36bdba23fe6df52ec4a0ed2cc /src/test/scheduler_tests.cpp | |
| parent | Merge pull request #6062 (diff) | |
| parent | More robust CScheduler unit test (diff) | |
| download | discoin-3c60937ce6a251e565e169715ebb2f3dd76825c4.tar.xz discoin-3c60937ce6a251e565e169715ebb2f3dd76825c4.zip | |
Merge pull request #6146
f501054 More robust CScheduler unit test (Gavin Andresen)
Diffstat (limited to 'src/test/scheduler_tests.cpp')
| -rw-r--r-- | src/test/scheduler_tests.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/test/scheduler_tests.cpp b/src/test/scheduler_tests.cpp index a26d0afae..cb1a427db 100644 --- a/src/test/scheduler_tests.cpp +++ b/src/test/scheduler_tests.cpp @@ -42,6 +42,8 @@ static void MicroSleep(uint64_t n) BOOST_AUTO_TEST_CASE(manythreads) { + seed_insecure_rand(false); + // Stress test: hundreds of microsecond-scheduled tasks, // serviced by 10 threads. // @@ -54,10 +56,6 @@ BOOST_AUTO_TEST_CASE(manythreads) // counters should sum to the number of initial tasks performed. CScheduler microTasks; - boost::thread_group microThreads; - for (int i = 0; i < 5; i++) - microThreads.create_thread(boost::bind(&CScheduler::serviceQueue, µTasks)); - boost::mutex counterMutex[10]; int counter[10] = { 0 }; boost::random::mt19937 rng(insecure_rand()); @@ -67,6 +65,9 @@ BOOST_AUTO_TEST_CASE(manythreads) boost::chrono::system_clock::time_point start = boost::chrono::system_clock::now(); boost::chrono::system_clock::time_point now = start; + boost::chrono::system_clock::time_point first, last; + size_t nTasks = microTasks.getQueueInfo(first, last); + BOOST_CHECK(nTasks == 0); for (int i = 0; i < 100; i++) { boost::chrono::system_clock::time_point t = now + boost::chrono::microseconds(randomMsec(rng)); @@ -77,9 +78,19 @@ BOOST_AUTO_TEST_CASE(manythreads) randomDelta(rng), tReschedule); microTasks.schedule(f, t); } + nTasks = microTasks.getQueueInfo(first, last); + BOOST_CHECK(nTasks == 100); + BOOST_CHECK(first < last); + BOOST_CHECK(last > now); + + // As soon as these are created they will start running and servicing the queue + boost::thread_group microThreads; + for (int i = 0; i < 5; i++) + microThreads.create_thread(boost::bind(&CScheduler::serviceQueue, µTasks)); MicroSleep(600); now = boost::chrono::system_clock::now(); + // More threads and more tasks: for (int i = 0; i < 5; i++) microThreads.create_thread(boost::bind(&CScheduler::serviceQueue, µTasks)); @@ -93,11 +104,9 @@ BOOST_AUTO_TEST_CASE(manythreads) microTasks.schedule(f, t); } - // All 2,000 tasks should be finished within 2 milliseconds. Sleep a bit longer. - MicroSleep(2100); - - microThreads.interrupt_all(); - microThreads.join_all(); + // Drain the task queue then exit threads + microTasks.stop(true); + microThreads.join_all(); // ... wait until all the threads are done int counterSum = 0; for (int i = 0; i < 10; i++) { |