Added an osgDB::ReadWriteMutex to help manage the ability to have serialize

write to objects but allow multiple threads to read at once in a read only way.
This commit is contained in:
Robert Osfield
2006-12-27 16:40:34 +00:00
parent cd133e5f2c
commit 30cb8735d3
8 changed files with 140 additions and 18 deletions

View File

@@ -37,15 +37,70 @@ class OSGDB_EXPORT ReentrantMutex : public OpenThreads::Mutex
private:
ReentrantMutex(const ReentrantMutex &):OpenThreads::Mutex() {}
ReentrantMutex(const ReentrantMutex&):OpenThreads::Mutex() {}
ReentrantMutex &operator=(const ReentrantMutex &) {return *(this);}
ReentrantMutex& operator =(const ReentrantMutex&) { return *(this); }
OpenThreads::Thread* _threadHoldingMutex;
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 1
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

@@ -171,8 +171,6 @@ namespace osgParticle
//added- 1/17/06- bgandere@nps.edu
//a var to keep from doing multiple updates
int _frameNumber;
OpenThreads::Mutex _cullUpdatelMutex;
};
// INLINE FUNCTIONS

View File

@@ -30,6 +30,8 @@
#include <osg/Vec3>
#include <osg/BoundingBox>
#include <osgDB/ReentrantMutex>
namespace osgParticle
{
@@ -163,6 +165,8 @@ namespace osgParticle
virtual void drawImplementation(osg::State& state) const;
virtual osg::BoundingBox computeBound() const;
osgDB::ReadWriteMutex& getReadWriteMutex() const { return _readWriteMutex; }
protected:
@@ -201,6 +205,8 @@ namespace osgParticle
int _detail;
mutable int _draw_count;
mutable osgDB::ReadWriteMutex _readWriteMutex;
};
// INLINE FUNCTIONS

View File

@@ -91,8 +91,6 @@ namespace osgParticle
//added 1/17/06- bgandere@nps.edu
//a var to keep from doing multiple updates per frame
int _frameNumber;
OpenThreads::Mutex _cullUpdatelMutex;
};
// INLINE FUNCTIONS