diff options
author | 2011-02-24 18:12:34 -0800 | |
---|---|---|
committer | 2011-02-24 18:12:34 -0800 | |
commit | d005004f1419e51680ea69a78e6835a7d1b71aac (patch) | |
tree | 7be512142993d775ce5a4220c68f61bb2dadf556 | |
parent | f14a1046e7242222300bbe88d530c3b531fc7678 (diff) |
Fix a wp<> bug where the owner ID would be wrong
this was introduced recently. we make sure to use
the correct owner id (the sp) instead of the wp.
Change-Id: I78fdc6ec0c2d3e687278b70442d74d1924b512a2
-rw-r--r-- | include/utils/RefBase.h | 7 | ||||
-rw-r--r-- | include/utils/StrongPointer.h | 14 |
2 files changed, 10 insertions, 11 deletions
diff --git a/include/utils/RefBase.h b/include/utils/RefBase.h index 9b0e7d8a44..f355087713 100644 --- a/include/utils/RefBase.h +++ b/include/utils/RefBase.h @@ -425,8 +425,11 @@ void wp<T>::set_object_and_refs(T* other, weakref_type* refs) template<typename T> sp<T> wp<T>::promote() const { - T* p = (m_ptr && m_refs->attemptIncStrong(this)) ? m_ptr : 0; - return sp<T>(p, true); + sp<T> result; + if (m_ptr && m_refs->attemptIncStrong(&result)) { + result.set_pointer(m_ptr); + } + return result; } template<typename T> diff --git a/include/utils/StrongPointer.h b/include/utils/StrongPointer.h index 5daccf4f09..a8c989749b 100644 --- a/include/utils/StrongPointer.h +++ b/include/utils/StrongPointer.h @@ -104,11 +104,8 @@ public: private: template<typename Y> friend class sp; template<typename Y> friend class wp; - - // Optimization for wp::promote(). - sp(T* p, bool); - - T* m_ptr; + void set_pointer(T* ptr); + T* m_ptr; }; #undef COMPARE @@ -206,10 +203,9 @@ void sp<T>::clear() } template<typename T> -sp<T>::sp(T* p, bool) -: m_ptr(p) - { - } +void sp<T>::set_pointer(T* ptr) { + m_ptr = ptr; +} template <typename T> inline TextOutput& operator<<(TextOutput& to, const sp<T>& val) |