From 1b02cf99dc6a18b0d165cff0f955f0fc248432a9 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 23 Sep 2008 13:58:49 +0000 Subject: [PATCH] Added read-threads command line and read thread test back end --- examples/osgunittests/CMakeLists.txt | 15 ++- examples/osgunittests/MultiThreadRead.cpp | 144 ++++++++++++++++++++++ examples/osgunittests/MultiThreadRead.h | 26 ++++ examples/osgunittests/osgunittests.cpp | 11 ++ 4 files changed, 193 insertions(+), 3 deletions(-) create mode 100644 examples/osgunittests/MultiThreadRead.cpp create mode 100644 examples/osgunittests/MultiThreadRead.h diff --git a/examples/osgunittests/CMakeLists.txt b/examples/osgunittests/CMakeLists.txt index 481d34105..4a3ccc33d 100644 --- a/examples/osgunittests/CMakeLists.txt +++ b/examples/osgunittests/CMakeLists.txt @@ -1,8 +1,17 @@ -#this file is automatically generated +SET(TARGET_SRC + UnitTestFramework.cpp + UnitTests_osg.cpp + osgunittests.cpp + performance.cpp + MultiThreadRead.cpp +) +SET(TARGET_H + UnitTestFramework.h + performance.h + MultiThreadRead.h +) -SET(TARGET_SRC UnitTestFramework.cpp UnitTests_osg.cpp osgunittests.cpp performance.cpp ) -SET(TARGET_H UnitTestFramework.h performance.h ) #### end var setup ### SETUP_COMMANDLINE_EXAMPLE(osgunittests) diff --git a/examples/osgunittests/MultiThreadRead.cpp b/examples/osgunittests/MultiThreadRead.cpp new file mode 100644 index 000000000..b1bf08984 --- /dev/null +++ b/examples/osgunittests/MultiThreadRead.cpp @@ -0,0 +1,144 @@ +/* OpenSceneGraph example, osgunittests. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ + +#include +#include +#include + +struct OSG_EXPORT RefBarrier : public osg::Referenced, public OpenThreads::Barrier +{ + RefBarrier(int numThreads): + OpenThreads::Barrier(numThreads) {} +}; + +class ReadThread : public osg::Referenced, public OpenThreads::Thread +{ +public: + + ReadThread(): + _done(false) + { + } + + virtual ~ReadThread() + { + _done = true; + + while(isRunning()) OpenThreads::Thread::YieldCurrentThread(); + } + + void addFileName(const std::string& filename) + { + _fileNames.push_back(filename); + } + + void setStartBarrier(RefBarrier* barrier) { _startBarrier = barrier; } + void setEndBarrier(RefBarrier* barrier) { _endBarrier = barrier; } + + virtual void run() + { + if (_startBarrier.valid()) + { +#if VERBOSE + std::cout<<"Waiting on start block "<block(); + } + +#if VERBOSE + std::cout<<"Starting "< node = osgDB::readNodeFile(filename); +#if VERBOSE + if (node.valid()) std::cout<<".. OK"<block(); + } + +#if VERBOSE + std::cout<<"Completed"< FileNames; + FileNames _fileNames; + bool _done; + osg::ref_ptr _startBarrier; + osg::ref_ptr _endBarrier; +}; + +void runMultiThreadReadTests(int numThreads) +{ +#if VERBOSE + osg::notify(osg::NOTICE)<<"runMultiThreadReadTests() -- running"< startBarrier = new RefBarrier(numThreads+1); + osg::ref_ptr endBarrier = new RefBarrier(numThreads+1); + + typedef std::list< osg::ref_ptr > ReadThreads; + ReadThreads readThreads; + + for(unsigned int i=0; i readThread = new ReadThread; + + readThread->setProcessorAffinity(numThreads % 4); + + readThread->setStartBarrier(startBarrier.get()); + readThread->setEndBarrier(endBarrier.get()); + + readThread->addFileName("cessna.osg"); + readThread->addFileName("glider.osg"); + readThread->addFileName("town.ive"); + + readThreads.push_back(readThread.get()); + + readThread->start(); + + } + + startBarrier->block(); + endBarrier->block(); + +#if VERBOSE + osg::notify(osg::NOTICE)<<"runMultiThreadReadTests() -- completed."< @@ -542,6 +543,9 @@ int main( int argc, char** argv ) bool printQuatTest = false; while (arguments.read("quat")) printQuatTest = true; + int numReadThreads = 0; + while (arguments.read("read-threads", numReadThreads)) {} + bool printPolytopeTest = false; while (arguments.read("polytope")) printPolytopeTest = true; @@ -622,6 +626,13 @@ int main( int argc, char** argv ) runPerformanceTests(); } + if (numReadThreads>0) + { + runMultiThreadReadTests(numReadThreads); + return 0; + } + + if (printPolytopeTest) { testPolytope();