Added read-threads <numThreads> command line and read thread test back end
This commit is contained in:
@@ -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)
|
||||
|
||||
144
examples/osgunittests/MultiThreadRead.cpp
Normal file
144
examples/osgunittests/MultiThreadRead.cpp
Normal file
@@ -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 <osg/Referenced>
|
||||
#include <osgDB/ReadFile>
|
||||
#include <OpenThreads/Thread>
|
||||
|
||||
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 "<<this<<std::endl;
|
||||
#endif
|
||||
_startBarrier->block();
|
||||
}
|
||||
|
||||
#if VERBOSE
|
||||
std::cout<<"Starting "<<this<<std::endl;
|
||||
#endif
|
||||
|
||||
do
|
||||
{
|
||||
if (!_fileNames.empty())
|
||||
{
|
||||
// take front filename;
|
||||
std::string filename = _fileNames.front();
|
||||
_fileNames.erase(_fileNames.begin());
|
||||
|
||||
#if VERBOSE
|
||||
std::cout<<"Reading "<<filename;
|
||||
#endif
|
||||
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(filename);
|
||||
#if VERBOSE
|
||||
if (node.valid()) std::cout<<".. OK"<<std::endl;
|
||||
else std::cout<<".. FAILED"<<std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
} while (!testCancel() && !_fileNames.empty() && !_done);
|
||||
|
||||
if (_endBarrier.valid())
|
||||
{
|
||||
#if VERBOSE
|
||||
std::cout<<"Waiting on end block "<<this<<std::endl;
|
||||
#endif
|
||||
_endBarrier->block();
|
||||
}
|
||||
|
||||
#if VERBOSE
|
||||
std::cout<<"Completed"<<this<<std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
typedef std::list<std::string> FileNames;
|
||||
FileNames _fileNames;
|
||||
bool _done;
|
||||
osg::ref_ptr<RefBarrier> _startBarrier;
|
||||
osg::ref_ptr<RefBarrier> _endBarrier;
|
||||
};
|
||||
|
||||
void runMultiThreadReadTests(int numThreads)
|
||||
{
|
||||
#if VERBOSE
|
||||
osg::notify(osg::NOTICE)<<"runMultiThreadReadTests() -- running"<<std::endl;
|
||||
#endif
|
||||
|
||||
osg::ref_ptr<RefBarrier> startBarrier = new RefBarrier(numThreads+1);
|
||||
osg::ref_ptr<RefBarrier> endBarrier = new RefBarrier(numThreads+1);
|
||||
|
||||
typedef std::list< osg::ref_ptr<ReadThread> > ReadThreads;
|
||||
ReadThreads readThreads;
|
||||
|
||||
for(unsigned int i=0; i<numThreads; ++i)
|
||||
{
|
||||
osg::ref_ptr<ReadThread> 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."<<std::endl;
|
||||
#endif
|
||||
}
|
||||
26
examples/osgunittests/MultiThreadRead.h
Normal file
26
examples/osgunittests/MultiThreadRead.h
Normal file
@@ -0,0 +1,26 @@
|
||||
/* -*-c++-*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef MULTITHREADEDREAD_H
|
||||
#define MULTITHREADEDREAD_H 1
|
||||
|
||||
extern void runMultiThreadReadTests(int numThreads);
|
||||
|
||||
#endif
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
#include "UnitTestFramework.h"
|
||||
#include "performance.h"
|
||||
#include "MultiThreadRead.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user