From c3adce3ef46bb428988c8647100dbe5927c8595b Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 19 Jul 2007 15:24:11 +0000 Subject: [PATCH] Added osg::RefBlockCount subclassed from the new OpenThreads::BlockCount and used it into osgterrain example --- examples/osgterrain/osgterrain.cpp | 94 +++--------------------------- include/osg/OperationThread | 12 +++- 2 files changed, 18 insertions(+), 88 deletions(-) diff --git a/examples/osgterrain/osgterrain.cpp b/examples/osgterrain/osgterrain.cpp index fedde4a0f..c9d388db6 100644 --- a/examples/osgterrain/osgterrain.cpp +++ b/examples/osgterrain/osgterrain.cpp @@ -16,6 +16,8 @@ * THE SOFTWARE. */ +#include + #include #include #include @@ -26,6 +28,7 @@ #include #include + #include #include @@ -53,96 +56,13 @@ typedef std::vector< osg::ref_ptr > GraphicsThreads; -class CountedBlock : public osg::Referenced -{ - public: - - CountedBlock(unsigned int blockCount); - - void completed(); - void block(); - - void reset(); - - void release(); - - void setBlockCount(unsigned int blockCount); - - protected: - - ~CountedBlock(); - - OpenThreads::Mutex _mut; - OpenThreads::Condition _cond; - unsigned int _numberOfBlocks; - unsigned int _blockCount; -}; - -CountedBlock::CountedBlock(unsigned int numberOfBlocks): - _numberOfBlocks(numberOfBlocks), - _blockCount(0) -{ -} - -void CountedBlock::completed() -{ - OpenThreads::ScopedLock mutlock(_mut); - if (_blockCount>0) - { - --_blockCount; - - if (_blockCount==0) - { - // osg::notify(osg::NOTICE)<<"Released"< mutlock(_mut); - if (_blockCount) - _cond.wait(&_mut); -} - -void CountedBlock::release() -{ - OpenThreads::ScopedLock mutlock(_mut); - if (_blockCount) - { - _blockCount = 0; - _cond.broadcast(); - } -} - -void CountedBlock::reset() -{ - OpenThreads::ScopedLock mutlock(_mut); - if (_numberOfBlocks!=_blockCount) - { - if (_numberOfBlocks==0) _cond.broadcast(); - _blockCount = _numberOfBlocks; - } -} - -void CountedBlock::setBlockCount(unsigned int blockCount) -{ - _numberOfBlocks = blockCount; -} - -CountedBlock::~CountedBlock() -{ - _blockCount = 0; - release(); -} class LoadAndCompileOperation : public osg::Operation { public: - LoadAndCompileOperation(const std::string& filename, GraphicsThreads& graphicsThreads, CountedBlock* block): + LoadAndCompileOperation(const std::string& filename, GraphicsThreads& graphicsThreads, osg::RefBlockCount* block): Operation("Load and compile Operation", false), _filename(filename), _graphicsThreads(graphicsThreads), @@ -174,7 +94,7 @@ public: std::string _filename; GraphicsThreads _graphicsThreads; osg::ref_ptr _loadedModel; - osg::ref_ptr _block; + osg::ref_ptr _block; }; @@ -308,7 +228,7 @@ public: { // osg::notify(osg::NOTICE)<<"Using OperationQueue"< > LoadAndCompileList; LoadAndCompileList loadAndCompileList; @@ -493,7 +413,7 @@ public: OpenThreads::Block _updatesMergedBlock; osg::ref_ptr _endOfCompilebarrier; - osg::ref_ptr _endOfLoadBlock; + osg::ref_ptr _endOfLoadBlock; osg::ref_ptr _operationQueue; }; diff --git a/include/osg/OperationThread b/include/osg/OperationThread index 3560b8f3a..20a579bdd 100644 --- a/include/osg/OperationThread +++ b/include/osg/OperationThread @@ -27,7 +27,7 @@ namespace osg { -class RefBlock: virtual public osg::Referenced, public OpenThreads::Block +class RefBlock : virtual public osg::Referenced, public OpenThreads::Block { public: @@ -36,6 +36,16 @@ class RefBlock: virtual public osg::Referenced, public OpenThreads::Block }; +class RefBlockCount : virtual public osg::Referenced, public OpenThreads::BlockCount +{ + public: + + RefBlockCount(unsigned blockCount): + osg::Referenced(true), + OpenThreads::BlockCount(blockCount) {} + +}; + /** Base class for implementing graphics operations.*/ class Operation : virtual public Referenced {