1. 通过wp创建sp的例子, 如:
int main() {
A* pA = new A();
wp<A> wpA(pA); // 弱引用计数为1, 强引用计数为初始值0x1000000.
sp<A> spA = wpA.promote(); // 通过promote()得到一个sp.
}
2. promote函数的实现:
template<typename T>
sp<T> wp<T>::promote() const {
retrun sp<T>(m_ptr, m_refs); // 调用sp的构造函数。
}
3. template<typename T>
sp<T>::sp(T* p, weakref_type* refs)
: m_ptr((p && refs->attemptIncStrong(this)) ? p : 0){
}
4. bool RefBase::weakref_type::attemptIncStrong(const void* id) {
incWeak(id); // 增加若引用计数,此时弱引用计数为2.
weakref_impl* const impl = static_cast<weakref_impl*>(this);
int32_t curCount = impl->mStrong; //此时仍为初始值
while(curCount > 0 && curCount != INITIAL_STRONG_VALUE) {
if (android_atomic_cmpxchg(curCount, curCount + 1, &impl->mStrong) == 0) {
break;
}
curCount = impl->mStrong;
}
if (curCount <= 0 || curCount == INITIAL_STRONG_VALUE) {
bool allow;
if (curCount == INITIAL_STRONG_VALUE) {
allow = (impl->mFlags&OBJECT_LIFETIME_WEAK) != OBJECE_LIFETIME_WEAK || impl->mBase->onIncStrongAttempted(FIRST_INC_STRONG, id);
} else {
allow = (impl->mFlags&OBJECT_LIFETIME_WEAK) != OBJECE_LIFETIME_WEAK && impl->mBase->onIncStrongAttempted(FIRST_INC_STRONG, id);
}
if (!allow) {
decWeak(id); // 不允许由弱生强,若引用计数减1,进来时已加1.
return false;
}
curCount = android_atomic_inc(&impl->mStrong); // 允许由弱生强,强引用计数加1.
if (curCount > 0 && curCount < INITIAL_STRONG_VALUE) {
impl->mBase->onLastStrongRef(id);
}
}
if (curCount == INITIAL_STRONG_VALUE) {
android_atomic_add(-INITIAL_STRONG_VALUE, &impl->mStrong); // 强引用计数变为1.
impl->mBase->onFirstRef();
}
return true;
}