Moved Block, ReentrantMutex and ReadWriteMutex into OpenThreads.

This commit is contained in:
Robert Osfield
2007-02-23 16:31:34 +00:00
parent 968a8d1118
commit ad3cac84e9
30 changed files with 67 additions and 343 deletions

View File

@@ -189,7 +189,7 @@ class OSG_EXPORT GraphicsContext : public Object
OpenThreads::Mutex* getOperationsMutex() { return &_operationsMutex; }
/** Get the operations queue block used to mark an empty queue, if you end items into the empty queu you must release this block.*/
osg::Block* getOperationsBlock() { return _operationsBlock.get(); }
osg::RefBlock* getOperationsBlock() { return _operationsBlock.get(); }
/** Get the current operations that is being run.*/
Operation* getCurrentOperation() { return _currentOperation.get(); }
@@ -381,7 +381,7 @@ class OSG_EXPORT GraphicsContext : public Object
OpenThreads::Thread* _threadOfLastMakeCurrent;
OpenThreads::Mutex _operationsMutex;
osg::ref_ptr<osg::Block> _operationsBlock;
osg::ref_ptr<osg::RefBlock> _operationsBlock;
OperationQueue _operations;
osg::ref_ptr<Operation> _currentOperation;

View File

@@ -20,58 +20,18 @@
#include <OpenThreads/Thread>
#include <OpenThreads/Barrier>
#include <OpenThreads/Condition>
#include <OpenThreads/Block>
#include <list>
namespace osg {
class Block: virtual public osg::Referenced {
class RefBlock: virtual public osg::Referenced, public OpenThreads::Block
{
public:
Block():_released(false) {}
inline void block()
{
OpenThreads::ScopedLock<OpenThreads::Mutex> mutlock(_mut);
if( !_released )
_cond.wait(&_mut);
}
RefBlock() {}
inline void release()
{
OpenThreads::ScopedLock<OpenThreads::Mutex> mutlock(_mut);
if (!_released)
{
_released = true;
_cond.broadcast();
}
}
inline void reset()
{
OpenThreads::ScopedLock<OpenThreads::Mutex> mutlock(_mut);
_released = false;
}
inline void set(bool doRelease)
{
if (doRelease!=_released)
{
if (doRelease) release();
else reset();
}
}
protected:
~Block()
{
release();
}
private:
OpenThreads::Mutex _mut;
OpenThreads::Condition _cond;
bool _released;
};
/** Base class for implementing graphics operations.*/
@@ -155,7 +115,7 @@ class OSG_EXPORT OperationsThread : public Referenced, public OpenThreads::Threa
bool _done;
OpenThreads::Mutex _operationsMutex;
osg::ref_ptr<osg::Block> _operationsBlock;
osg::ref_ptr<osg::RefBlock> _operationsBlock;
OperationQueue _operations;
osg::ref_ptr<Operation> _currentOperation;
@@ -195,7 +155,7 @@ struct OSG_EXPORT BarrierOperation : public Operation, public OpenThreads::Barri
/** ReleaseContext_Block_MakeCurrentOperation releases the context for another thread to aquire,
* then blocks waiting for context to be released, once the block is release the context is re-aqquired.*/
struct OSG_EXPORT ReleaseContext_Block_MakeCurrentOperation : public Operation, public Block
struct OSG_EXPORT ReleaseContext_Block_MakeCurrentOperation : public Operation, public RefBlock
{
ReleaseContext_Block_MakeCurrentOperation():
Operation("ReleaseContext_Block_MakeCurrent", false) {}

View File

@@ -84,7 +84,7 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl
/** Get the whether UseFrameBlock is on or off.*/
bool getUseFrameBlock() const { return _useFrameBlock; }
osg::Block* getFrameBlock() { return _frameBlock.get(); }
osg::RefBlock* getFrameBlock() { return _frameBlock.get(); }
/** Set the priority of the database pager thread during the frame (i.e. while cull and draw are running.)*/
void setThreadPriorityDuringFrame(ThreadPriority duringFrame) { _threadPriorityDuringFrame = duringFrame; }
@@ -293,7 +293,7 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl
bool _startThreadCalled;
osg::ref_ptr<osg::Block> _databasePagerThreadBlock;
osg::ref_ptr<osg::RefBlock> _databasePagerThreadBlock;
inline void updateDatabasePagerThreadBlock()
{
@@ -325,7 +325,7 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl
bool _useFrameBlock;
int _numFramesActive;
mutable OpenThreads::Mutex _numFramesActiveMutex;
osg::ref_ptr<osg::Block> _frameBlock;
osg::ref_ptr<osg::RefBlock> _frameBlock;
int _frameNumber;
ThreadPriority _threadPriorityDuringFrame;

View File

@@ -1,108 +0,0 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGDB_REENTRANTMUTEX
#define OSGDB_REENTRANTMUTEX
#include <OpenThreads/Thread>
#include <OpenThreads/Mutex>
#include <osgDB/Export>
namespace osgDB {
class OSGDB_EXPORT ReentrantMutex : public OpenThreads::Mutex
{
public:
ReentrantMutex();
virtual ~ReentrantMutex();
virtual int lock();
virtual int unlock();
virtual int trylock();
private:
ReentrantMutex(const ReentrantMutex&):OpenThreads::Mutex() {}
ReentrantMutex& operator =(const ReentrantMutex&) { return *(this); }
OpenThreads::Thread* _threadHoldingMutex;
OpenThreads::Mutex _lockCountMutex;
unsigned int _lockCount;
};
class OSGDB_EXPORT ReadWriteMutex
{
public:
ReadWriteMutex();
virtual ~ReadWriteMutex();
virtual int readLock();
virtual int readUnlock();
virtual int writeLock();
virtual int writeUnlock();
protected:
ReadWriteMutex(const ReadWriteMutex&) {}
ReadWriteMutex& operator = (const ReadWriteMutex&) { return *(this); }
#if 0
ReentrantMutex _readWriteMutex;
ReentrantMutex _readCountMutex;
#else
OpenThreads::Mutex _readWriteMutex;
OpenThreads::Mutex _readCountMutex;
#endif
unsigned int _readCount;
};
class ScopedReadLock
{
public:
ScopedReadLock(ReadWriteMutex& mutex):_mutex(mutex) { _mutex.readLock(); }
~ScopedReadLock() { _mutex.readUnlock(); }
protected:
ReadWriteMutex& _mutex;
};
class ScopedWriteLock
{
public:
ScopedWriteLock(ReadWriteMutex& mutex):_mutex(mutex) { _mutex.writeLock(); }
~ScopedWriteLock() { _mutex.writeUnlock(); }
protected:
ReadWriteMutex& _mutex;
};
}
#endif

View File

@@ -30,7 +30,7 @@
#include <osg/Vec3>
#include <osg/BoundingBox>
#include <osgDB/ReentrantMutex>
#include <OpenThreads/ReadWriteMutex>
namespace osgParticle
{
@@ -166,7 +166,7 @@ namespace osgParticle
virtual osg::BoundingBox computeBound() const;
osgDB::ReadWriteMutex* getReadWriteMutex() const { return &_readWriteMutex; }
OpenThreads::ReadWriteMutex* getReadWriteMutex() const { return &_readWriteMutex; }
protected:
@@ -205,7 +205,7 @@ namespace osgParticle
int _detail;
mutable int _draw_count;
mutable osgDB::ReadWriteMutex _readWriteMutex;
mutable OpenThreads::ReadWriteMutex _readWriteMutex;
};