00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "fennel/common/CommonPreamble.h"
00025 #include "fennel/test/ThreadedTestBase.h"
00026 #include "fennel/synch/ThreadPool.h"
00027
00028 #include <boost/test/test_tools.hpp>
00029 #include <numeric>
00030
00031 using namespace fennel;
00032
00033 ThreadedTestBase::ThreadedTestBase()
00034 {
00035 nSeconds = configMap.getIntParam("testDuration",10);
00036 defaultThreadCount = configMap.getIntParam("defaultThreads",1);
00037 }
00038
00039 ThreadedTestBase::~ThreadedTestBase()
00040 {
00041 }
00042
00043 void ThreadedTestBase::runThreadedTestCase()
00044 {
00045 bDone = false;
00046
00047
00048 std::replace_if(
00049 threadCounts.begin(),
00050 threadCounts.end(),
00051 std::bind2nd(std::equal_to<int>(),-1),
00052 defaultThreadCount);
00053
00054
00055 int nThreads = std::accumulate(
00056 threadCounts.begin(),
00057 threadCounts.end(),
00058 0);
00059
00060
00061 pStartBarrier.reset(new boost::barrier(nThreads));
00062
00063
00064 ThreadPool<ThreadedTestBaseTask> threadPool;
00065 threadPool.start(nThreads);
00066
00067
00068 for (uint i = 0; i < threadCounts.size(); ++i) {
00069 for (int j = 0; j < threadCounts[i]; ++j) {
00070 ThreadedTestBaseTask task(*this,i);
00071 threadPool.submitTask(task);
00072 }
00073 }
00074
00075
00076 snooze(nSeconds);
00077
00078
00079 bDone = true;
00080 threadPool.stop();
00081 }
00082
00083 void ThreadedTestBase::threadInit()
00084 {
00085 }
00086
00087 void ThreadedTestBase::threadTerminate()
00088 {
00089 }
00090
00091 ThreadedTestBaseTask::ThreadedTestBaseTask(
00092 ThreadedTestBase &testInit,
00093 int iOpInit)
00094 : test(testInit), iOp(iOpInit)
00095 {
00096 }
00097
00098 void ThreadedTestBaseTask::execute()
00099 {
00100 test.threadInit();
00101 test.pStartBarrier->wait();
00102 try {
00103 while (!test.bDone) {
00104 if (!test.testThreadedOp(iOp)) {
00105 break;
00106 }
00107 }
00108 } catch (...) {
00109 test.threadTerminate();
00110 throw;
00111 }
00112 test.threadTerminate();
00113 }
00114
00115