ThreadedTestBase.cpp

Go to the documentation of this file.
00001 /*
00002 // $Id: //open/dev/fennel/test/ThreadedTestBase.cpp#9 $
00003 // Fennel is a library of data storage and processing components.
00004 // Copyright (C) 2005-2009 The Eigenbase Project
00005 // Copyright (C) 2005-2009 SQLstream, Inc.
00006 // Copyright (C) 2005-2009 LucidEra, Inc.
00007 // Portions Copyright (C) 1999-2009 John V. Sichi
00008 //
00009 // This program is free software; you can redistribute it and/or modify it
00010 // under the terms of the GNU General Public License as published by the Free
00011 // Software Foundation; either version 2 of the License, or (at your option)
00012 // any later version approved by The Eigenbase Project.
00013 //
00014 // This program is distributed in the hope that it will be useful,
00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 // GNU General Public License for more details.
00018 //
00019 // You should have received a copy of the GNU General Public License
00020 // along with this program; if not, write to the Free Software
00021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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     // materialize default thread counts
00048     std::replace_if(
00049         threadCounts.begin(),
00050         threadCounts.end(),
00051         std::bind2nd(std::equal_to<int>(),-1),
00052         defaultThreadCount);
00053 
00054     // calculate how many threads are needed
00055     int nThreads = std::accumulate(
00056         threadCounts.begin(),
00057         threadCounts.end(),
00058         0);
00059 
00060     // initialize a barrier to make sure they all start at once
00061     pStartBarrier.reset(new boost::barrier(nThreads));
00062 
00063     // fire 'em up
00064     ThreadPool<ThreadedTestBaseTask> threadPool;
00065     threadPool.start(nThreads);
00066 
00067     // and distribute the tasks
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     // run the tests for the requested duration
00076     snooze(nSeconds);
00077 
00078     // tell threads to quit and then wait for them to finish up
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 // End ThreadedTestBase.cpp

Generated on Mon Jun 22 04:00:21 2009 for Fennel by  doxygen 1.5.1