diff --git a/include/osg/observer_ptr b/include/osg/observer_ptr index a6d03c10d..c8300fbe5 100644 --- a/include/osg/observer_ptr +++ b/include/osg/observer_ptr @@ -51,7 +51,7 @@ class observer_ptr : public Observer { if (&rp==this) return *this; - OpenThreads::ScopedLock lock(_mutex); + OpenThreads::ScopedLock lock(*getObserverMutex()); if (_ptr==rp._ptr) return *this; if (_ptr) _ptr->removeObserver(this); @@ -63,7 +63,8 @@ class observer_ptr : public Observer inline observer_ptr& operator = (T* ptr) { - OpenThreads::ScopedLock lock(_mutex); + OpenThreads::ScopedLock lock(*getObserverMutex()); + if (_ptr==ptr) return *this; if (_ptr) _ptr->removeObserver(this); @@ -76,7 +77,7 @@ class observer_ptr : public Observer // robust thread safe access to pointer ref_ptr lock() const { - OpenThreads::ScopedLock lock(_mutex); + OpenThreads::ScopedLock lock(*getObserverMutex()); return ref_ptr(_ptr); } @@ -111,11 +112,10 @@ class observer_ptr : public Observer { T* ref_obj = static_cast(obj); - OpenThreads::ScopedLock lock(_mutex); + OpenThreads::ScopedLock lock(*getObserverMutex()); if (ref_obj->referenceCount() == 0) _ptr = 0; } - mutable OpenThreads::Mutex _mutex; T* _ptr; };