diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2004-05-27 14:28:44 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2004-05-27 14:28:44 +0000 |
| commit | ae9b6fba0b02b5990fd1635a2154336c5043df02 (patch) | |
| tree | 153036c0522befda7ed78dfe99c0b91533863cb1 /lib | |
| parent | a8f6d337d58ee560e74b662c1abceaa986cacc30 (diff) | |
| download | enigma2-ae9b6fba0b02b5990fd1635a2154336c5043df02.tar.gz enigma2-ae9b6fba0b02b5990fd1635a2154336c5043df02.zip | |
add helper object for eSmartPtr, resolving a race condition.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/base/smartptr.h | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/lib/base/smartptr.h b/lib/base/smartptr.h index 029fd1dc..c89763e3 100644 --- a/lib/base/smartptr.h +++ b/lib/base/smartptr.h @@ -7,6 +7,22 @@ template<class T> class ePtr { + /* read doc/iObject about the ePtrHelper */ + template<class T1> + class ePtrHelper + { + T1 *m_obj; + public: + inline ePtrHelper(T1 *obj): m_obj(obj) + { + m_obj->AddRef(); + } + inline ~ePtrHelper() + { + m_obj->Release(); + } + inline T1* operator->() { return m_obj; } + }; protected: T *ptr; public: @@ -51,7 +67,12 @@ public: ptr->Release(); } T* &ptrref() { assert(!ptr); return ptr; } - T* operator->() { assert(ptr); return ptr; } + ePtrHelper<T> operator->() { assert(ptr); return ePtrHelper<T>(ptr); } + + /* for const objects, we don't need the helper, as they can't */ + /* be changed outside the program flow. at least this is */ + /* what the compiler assumes, so in case you're using const */ + /* ePtrs note that they have to be const. */ const T* operator->() const { assert(ptr); return ptr; } operator T*() const { return this->ptr; } }; |
