From f8321981281eb7277d0d459bfc8fcf70ae46f719 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 17 May 2010 09:03:44 +0000 Subject: [PATCH] From Tim Moore, refactore WeakReference/Referenced to avoid signalling the observers when do a unref_nodelete. --- include/osg/Referenced | 8 ++++++-- include/osg/observer_ptr | 2 +- src/osg/Referenced.cpp | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/include/osg/Referenced b/include/osg/Referenced index 848eef3a5..c0b55bc61 100644 --- a/include/osg/Referenced +++ b/include/osg/Referenced @@ -89,8 +89,12 @@ class OSG_EXPORT Referenced not delete it, even if ref count goes to 0. Warning, unref_nodelete() should only be called if the user knows exactly who will be responsible for, one should prefer unref() over unref_nodelete() - as the later can lead to memory leaks.*/ - int unref_nodelete() const; + as the later can lead to memory leaks. + + @param signalObserversOnZeroRefCount - By default true, adjust the reference count and send + any signal to observers if ref count goes to zero. + */ + int unref_nodelete(bool signalObserversOnZeroRefCount = true) const; /** Return the number pointers currently referencing this object. */ inline int referenceCount() const { return _refCount; } diff --git a/include/osg/observer_ptr b/include/osg/observer_ptr index b8dcc1542..7ab3e4571 100644 --- a/include/osg/observer_ptr +++ b/include/osg/observer_ptr @@ -47,7 +47,7 @@ struct WeakReference : public Observer, public Referenced // The object is in the process of being deleted, but our // objectDeleted() method hasn't been run yet (and we're // blocking it -- and the final destruction -- with our lock). - _ptr->unref_nodelete(); + _ptr->unref_nodelete(false); return 0; } return _ptr; diff --git a/src/osg/Referenced.cpp b/src/osg/Referenced.cpp index b627f8cf2..f45f6b9b3 100644 --- a/src/osg/Referenced.cpp +++ b/src/osg/Referenced.cpp @@ -334,7 +334,7 @@ void Referenced::setThreadSafeRefUnref(bool threadSafe) #endif } -int Referenced::unref_nodelete() const +int Referenced::unref_nodelete(bool signalObserversOnZeroRefCount) const { int result; #if defined(_OSG_REFERENCED_USE_ATOMIC_OPERATIONS) @@ -355,7 +355,7 @@ int Referenced::unref_nodelete() const } #endif - if (needUnreferencedSignal) + if (needUnreferencedSignal && signalObserversOnZeroRefCount) { signalObserversAndDelete(true,false,false); }