14 #ifndef OSG_REFERENCED
15 #define OSG_REFERENCED 1
19 #include <OpenThreads/ScopedLock>
20 #include <OpenThreads/Mutex>
21 #include <OpenThreads/Atomic>
23 #if !defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
24 # define _OSG_REFERENCED_USE_ATOMIC_OPERATIONS
35 template <
typename T, T M()>
57 virtual void setThreadSafeRefUnref(
bool threadSafe);
61 #if defined(_OSG_REFERENCED_USE_ATOMIC_OPERATIONS)
64 bool getThreadSafeRefUnref()
const {
return _refMutex!=0; }
68 #if defined(_OSG_REFERENCED_USE_ATOMIC_OPERATIONS)
79 inline int ref()
const;
85 inline int unref()
const;
93 int unref_nodelete()
const;
102 #if defined(_OSG_REFERENCED_USE_ATOMIC_OPERATIONS)
103 return static_cast<ObserverSet*
>(_observerSet.get());
113 void addObserver(
Observer* observer)
const;
116 void removeObserver(
Observer* observer)
const;
121 static void setThreadSafeReferenceCounting(
bool enableThreadSafeReferenceCounting);
124 static bool getThreadSafeReferenceCounting();
140 void signalObserversAndDelete(
bool signalDelete,
bool doDelete)
const;
142 void deleteUsingDeleteHandler()
const;
144 #if defined(_OSG_REFERENCED_USE_ATOMIC_OPERATIONS)
152 mutable int _refCount;
154 mutable void* _observerSet;
160 #if defined(_OSG_REFERENCED_USE_ATOMIC_OPERATIONS)
178 #if defined(_OSG_REFERENCED_USE_ATOMIC_OPERATIONS)
180 bool needDelete = (newRef == 0);
182 bool needDelete =
false;
187 needDelete = newRef==0;
192 needDelete = newRef==0;
void intrusive_ptr_release(Referenced *p)
This class provides an object-oriented thread mutex interface.
void intrusive_ptr_add_ref(Referenced *p)
OpenThreads::AtomicPtr _observerSet
bool getThreadSafeRefUnref() const
This class provides an atomic increment and decrement operation.
int referenceCount() const
This class provides an atomic pointer assignment using cas operations.
OpenThreads::Atomic _refCount
ObserverSet * getObserverSet() const
OpenThreads::Mutex * getRefMutex() const
void signalObserversAndDelete(bool signalDelete, bool doDelete) const