`
star65225692
  • 浏览: 273414 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类

Android上C++对象的wp提升为sp的过程

阅读更多

wp对象调用promote方法返回sp对象,如果sp指向的对象 已经销毁,promote返回NULL

template<typename T>

sp<T> wp<T>::promote() const

{

    sp<T> result;

    if (m_ptr && m_refs->attemptIncStrong(&result)) {

        result.set_pointer(m_ptr);

    }

    return result;

}

可以将wp提升为sp的三种情况:

1、  没有sp指向目标对象且mStrong == INITIAL_STRONG_VALUE

2、  没有sp指向目标对象且mStrong == 0 且mFlags == OBJECT_LIFETIME_WEAK

3、有sp指向目标对象

attemptIncStrong()代码说明了上面的三种情况

bool RefBase::weakref_type::attemptIncStrong(const void* id)

{

    incWeak(id);

  

    weakref_impl* const impl = static_cast<weakref_impl*>(this);

  

    int32_t curCount = impl->mStrong;

    LOG_ASSERT(curCount >= 0, "attemptIncStrong called on %p after underflow",

               this);

    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) {

            // Attempting to acquire first strong reference...  this is allowed

            // if the object does NOT have a longer lifetime (meaning the

            // implementation doesn't need to see this), or if the implementation

            // allows it to happen.

            allow = (impl->mFlags&OBJECT_LIFETIME_WEAK) != OBJECT_LIFETIME_WEAK

                  || impl->mBase->onIncStrongAttempted(FIRST_INC_STRONG, id);

        } else {

            // Attempting to revive the object...  this is allowed

            // if the object DOES have a longer lifetime (so we can safely

            // call the object with only a weak ref) and the implementation

            // allows it to happen.

            allow = (impl->mFlags&OBJECT_LIFETIME_WEAK) == OBJECT_LIFETIME_WEAK

                  && impl->mBase->onIncStrongAttempted(FIRST_INC_STRONG, id);

        }

        if (!allow) {

            decWeak(id);

            return false;

        }

        curCount = android_atomic_inc(&impl->mStrong);

 

        …

        }

    }

  

    impl->addStrongRef(id);

    …

    return true;

}

分享到:
评论

相关推荐

    Android_WP_SP浅析

    在Android的Native层开发中,为了管理和防止内存泄漏,Google引入了一套基于C++的智能指针系统,主要包含两个关键类型:sp(Strong Pointer)和wp(Weak Pointer)。它们都是基于类RefBase的引用计数机制来实现的,...

    anroid智能指针(wp,sp)学习总结

    智能指针sp和wp在android c++源码中使用非常频繁,例如IBinder机制,但是它比c++中普通的智能指针要复杂很多,相信不少android学习者如果c++基础不是很扎实的,看起来会比较吃力和枯燥。本人在android 4.2.2源码基础...

    Android sp&wp 测试代码

    总之,`Android sp&wp 测试代码`项目旨在帮助开发者理解SharedPreferences和WakeLock的底层实现,通过C语言的角度揭示Android系统的一部分工作原理。通过学习和实践,可以加深对Android系统如何管理数据存储和电源...

    理解 Android sp wp 指针

    在Android中,`sp`和`wp`是C++智能指针的缩写,`sp`代表`std::shared_ptr`,`wp`代表`std::weak_ptr`,它们是C++11标准库中的智能指针类型。`std::shared_ptr`是强引用,而`std::weak_ptr`是弱引用。 3. **std::...

    android智能指针详解[收集].pdf

    在Android系统中,智能指针是用来管理对象生命周期的重要工具,主要分为`sp`(strong pointer)和`wp`(weak pointer)两种类型。它们都是基于C++的引用计数机制,用于自动管理内存,防止内存泄漏。在Android框架层,...

    Android垃圾回收实质内容解析PPT.ppt

    在Android系统中,`sp`和`wp`的配合使用可以有效地管理C++对象,避免内存泄漏,同时保证了内存的高效利用。这种机制使得开发者无需手动管理内存,减少了出错的可能性,提高了代码的可维护性和安全性。理解并熟练掌握...

    Android系统进程间通信Binder机制在低层的C++接口源代码文件分析[归类].pdf

    `sp&lt;T&gt;`用于持有对象并自动管理其生命周期,而`wp&lt;T&gt;`则允许在对象可能已经被删除的情况下保持引用。 `IBinder`是Binder接口的核心抽象类,它继承自`RefBase`并声明了一系列虚函数。这些函数包括`...

    Android框架层学习指导

    总之,Android框架层的学习是一个综合性的过程,涉及C++基础、设计模式、系统架构等多个方面。通过逐步深入,你将能够掌握Android系统的核心,从而在开发中游刃有余。记住,持续实践和探索是深化理解的关键。

    深入理解Android:卷I

    - **sp、wp、RefBase、Thread等类**:第五章介绍了Android系统中常用的类如sp、wp、RefBase、Thread等,以及同步类、Handler和Looper机制,这些都是理解和开发Android应用的基础。 #### 6. Binder机制全面解析 - **...

    Binder机制在低层的C++接口源代码文件分析

    - **wp**: 与sp类似,但是它是弱指针,主要用于解决循环引用的问题。 ##### IBinder.h与Binder.cpp - **IBinder**: 这是一个非常重要的低层类,所有的Binder类型都继承自它。它是一个抽象类,包含了一些关键的方法...

    深入理解Android:卷I--详细书签版

     对于Android应用开发工程师而言,本书中关于Binder,以及sp、wp、Handler和Looper等常用类的分析或许能帮助你迅速适应Android平台上的开发工作。  (2)Android系统开发工程师  Android系统开发工程师常常需要...

    Mstar理论及实践篇参考.pdf

    4. 弱引用与强引用转换:弱指针`wp_obj`需要通过`promote()`方法升级为强指针`sp_obj`才能访问对象。例如: ```cpp wp&lt;MyClass&gt; wp_obj = new MyClass(); sp&lt;MyClass&gt; sp_obj = wp_obj.promote(); ``` 5. 效率...

    Mstar理论及实践篇

    当需要操作对象时,可以将wp转换为sp,如果对象已经被销毁,则wp的promote()方法会返回空指针。这种方式有助于避免无效指针的访问,保证了程序的稳定运行。 智能指针的使用方法也很关键,类需要继承自RefBase,并且...

    Mstar安卓理论及实践篇

    在Android源代码中,经常会看到形如`sp&lt;xxx&gt;`、`wp&lt;xxx&gt;`这样的类型定义,这其实是Android中的智能指针。 智能指针有两种类型:强指针(strong pointer)和弱指针(weak pointer)。强指针通过引用计数来记录有多少...

    [文档]深入理解Andorid重难点.ppt

    - **RefBase、sp和wp**:RefBase是Android中用于引用计数管理的基础类,sp和wp是智能指针,分别代表强引用和弱引用,用于管理对象生命周期,防止内存泄漏。 **Binder重难点分析** - **Binder时空穿越魔术揭秘**:...

Global site tag (gtag.js) - Google Analytics