Fennel: /home/pub/open/dev/fennel/test/ThreadedTestBase.cpp Source File (original) (raw)

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 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(),-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 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