am 1cb3fdc9: Merge "Fix a bug in sp<> and wp<> which could cause memory corruptions" into gingerbread

Merge commit '1cb3fdc91e1b82a5afe064714a1b530cc05577a7' into gingerbread-plus-aosp

* commit '1cb3fdc91e1b82a5afe064714a1b530cc05577a7':
  Fix a bug in sp<> and wp<> which could cause memory corruptions
This commit is contained in:
Mathias Agopian
2010-06-25 13:29:54 -07:00
committed by Android Git Automerger

View File

@@ -333,9 +333,10 @@ sp<T>::~sp()
template<typename T> template<typename T>
sp<T>& sp<T>::operator = (const sp<T>& other) { sp<T>& sp<T>::operator = (const sp<T>& other) {
if (other.m_ptr) other.m_ptr->incStrong(this); T* otherPtr(other.m_ptr);
if (otherPtr) otherPtr->incStrong(this);
if (m_ptr) m_ptr->decStrong(this); if (m_ptr) m_ptr->decStrong(this);
m_ptr = other.m_ptr; m_ptr = otherPtr;
return *this; return *this;
} }
@@ -351,9 +352,10 @@ sp<T>& sp<T>::operator = (T* other)
template<typename T> template<typename U> template<typename T> template<typename U>
sp<T>& sp<T>::operator = (const sp<U>& other) sp<T>& sp<T>::operator = (const sp<U>& other)
{ {
if (other.m_ptr) other.m_ptr->incStrong(this); U* otherPtr(other.m_ptr);
if (otherPtr) otherPtr->incStrong(this);
if (m_ptr) m_ptr->decStrong(this); if (m_ptr) m_ptr->decStrong(this);
m_ptr = other.m_ptr; m_ptr = otherPtr;
return *this; return *this;
} }
@@ -466,10 +468,12 @@ wp<T>& wp<T>::operator = (T* other)
template<typename T> template<typename T>
wp<T>& wp<T>::operator = (const wp<T>& other) wp<T>& wp<T>::operator = (const wp<T>& other)
{ {
if (other.m_ptr) other.m_refs->incWeak(this); weakref_type* otherRefs(other.m_refs);
T* otherPtr(other.m_ptr);
if (otherPtr) otherRefs->incWeak(this);
if (m_ptr) m_refs->decWeak(this); if (m_ptr) m_refs->decWeak(this);
m_ptr = other.m_ptr; m_ptr = otherPtr;
m_refs = other.m_refs; m_refs = otherRefs;
return *this; return *this;
} }
@@ -478,8 +482,9 @@ wp<T>& wp<T>::operator = (const sp<T>& other)
{ {
weakref_type* newRefs = weakref_type* newRefs =
other != NULL ? other->createWeak(this) : 0; other != NULL ? other->createWeak(this) : 0;
T* otherPtr(other.m_ptr);
if (m_ptr) m_refs->decWeak(this); if (m_ptr) m_refs->decWeak(this);
m_ptr = other.get(); m_ptr = otherPtr;
m_refs = newRefs; m_refs = newRefs;
return *this; return *this;
} }
@@ -498,10 +503,12 @@ wp<T>& wp<T>::operator = (U* other)
template<typename T> template<typename U> template<typename T> template<typename U>
wp<T>& wp<T>::operator = (const wp<U>& other) wp<T>& wp<T>::operator = (const wp<U>& other)
{ {
if (other.m_ptr) other.m_refs->incWeak(this); weakref_type* otherRefs(other.m_refs);
U* otherPtr(other.m_ptr);
if (otherPtr) otherRefs->incWeak(this);
if (m_ptr) m_refs->decWeak(this); if (m_ptr) m_refs->decWeak(this);
m_ptr = other.m_ptr; m_ptr = otherPtr;
m_refs = other.m_refs; m_refs = otherRefs;
return *this; return *this;
} }
@@ -510,8 +517,9 @@ wp<T>& wp<T>::operator = (const sp<U>& other)
{ {
weakref_type* newRefs = weakref_type* newRefs =
other != NULL ? other->createWeak(this) : 0; other != NULL ? other->createWeak(this) : 0;
U* otherPtr(other.m_ptr);
if (m_ptr) m_refs->decWeak(this); if (m_ptr) m_refs->decWeak(this);
m_ptr = other.get(); m_ptr = otherPtr;
m_refs = newRefs; m_refs = newRefs;
return *this; return *this;
} }