Updated wrappers

This commit is contained in:
Robert Osfield
2010-05-17 18:37:32 +00:00
parent 65c09c8e0d
commit 61121daaab
12 changed files with 72 additions and 204 deletions

View File

@@ -30,7 +30,27 @@ struct WeakReference : public Observer, public Referenced
{
WeakReference(const T* ptr) : _ptr(const_cast<T*>(ptr)) {}
void objectDeleted(void*);
virtual void objectDeleted(void*)
{
bool deleteNeeded = false;
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
if (!_ptr)
{
// The last weak reference was deleted after the last
// reference, but the observer hasn't run yet. The
// observer can't be prevented from running, so it
// must delete itself.
deleteNeeded = true;
}
else
{
_ptr = 0;
}
}
if (deleteNeeded) delete this;
}
/**
* "Lock" a Referenced object i.e., protect it from being deleted
* by incrementing its reference count.
@@ -71,6 +91,7 @@ struct UnsafeWeakReference : public WeakReference<T>
return 0;
}
};
/**
Delete the WeakReference object, if necessary. The WeakReference
should be deleted when the last observer_ptr pointing to it goes
@@ -259,27 +280,6 @@ protected:
WeakReference<T>* _reference;
};
template<typename T>
void WeakReference<T>::objectDeleted(void*)
{
bool deleteNeeded = false;
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
if (!_ptr)
{
// The last weak reference was deleted after the last
// reference, but the observer hasn't run yet. The
// observer can't be prevented from running, so it
// must delete itself.
deleteNeeded = true;
}
else
{
_ptr = 0;
}
}
if (deleteNeeded) delete this;
}
template<typename T>
WeakReference<T>*