码迷,mamicode.com
首页 > 其他好文 > 详细

RefBase, sp和wp (2)

时间:2015-03-14 15:03:42      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

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;

}

RefBase, sp和wp (2)

标签:

原文地址:http://www.cnblogs.com/Jackwen/p/4335786.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!