Moved Block, ReentrantMutex and ReadWriteMutex into OpenThreads.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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) {}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user