RefBase, sp和wp (2)

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;

}

时间: 2024-11-08 22:48:41

RefBase, sp和wp (2)的相关文章

RefBase, sp和wp (3)

RefBase提供了一个函数: extendObjectLifetime(int32_t mode); 用于在构造函数中设置mFlags的值. 以及定义了一个枚举: enum { OBJECT_LIFETIME_WEAK = 0x0001;              // 二进制为B01 OBJECT_LIFETIME_FOREVER = 0x0003;          // 二进制为B11, 即FOREVER包含了WEAK的情况. }; 1. 当mFlags为0时,强引用计数控制实际对象生命

Android指针管理:RefBase,SP,WP

Android中通过引用计数来实现智能指针,并且实现有强指针与弱指针.由对象本身来提供引用计数器,但是对象不会去维护引用计数器的值,而是由智能指针来管理. 要达到所有对象都可用引用计数器实现智能指针管理的目标,可以定义一个公共类,提供引用计数的方法,所有对象都去继承这个公共类,这样就可以实现所有对象都可以用引用计数来管理的目标,在Android中,这个公共类就是RefBase,同时还有一个简单版本LightRefBase. RefBase作为公共基类提供了引用计数的方法,但是并不去维护引用计数的

android RefBase、sp、wp

首先RefBase在android的c++部分是作为一个所有类的基类,其作用跟Java中的Object类似 这个类中存在一个私有成员: weakref_impl* const mRefs;(weakref_impl是weakref_type的子类) 这个mRefs是“影子对象”,是管理一个对象的引用计数的关键 RefBase的构造中mRefs(new weakref_impl(this)),new一个weakref_impl对象,weakref_impl的构造形参是RefBase的指针 同时会初

Android指针管理:RefBase,SP,WP (二)

(1)在Android中,RefBase结合了sp和wp,实现了一套通过引用计数的方法来控制对象声明周期的方法. RefBase的定义在/frameworks/base/include/utils/RefBase.h,实现在/frameworks/base/libs/utils/RefBase.cpp.wp的定义在/frameworks/base/include/utils/RefBase.h,sp的定义在/frameworks/base/include/utils/StrongPointer.

Android 关键类(RefBase,sp, wp)

RefBase:含有内部类weakRef_Impl(影子对象),影子对象中有两个引用计数变量(强引用计数,弱引用计数) sp,构造的时候,强,弱引用计数均+1,析构的时候都-1 wp,构造的时候,弱引用+1,强引用不变,析构的时候弱引用-1,强引用不变 强引用计数=0:实际对象被delete 弱引用计数=0:影子对象被delete 延长对象生命: enum { OBJECT_LIFETIME_WEAK, OBJECT_LIFETIME_FOREVER }: OBJECT_LIFETIME_WEA

Android framework回顾 sp 和 wp sp对象

用MediaPlayer说明sp的实现.sp是一个模板类,T是RefBase的子类.只要继承于RefBase的类都可以使用sp.binder类也继承RefBase类,binder的实现离不开RefBase. 用如下代码说说我遇到的疑惑. 201 static sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz) 202 { 203     Mutex::Autolock l(sLock); 204     MediaPlayer*

Chromium和WebKit的智能指针实现原理分析

C++不像Java一样,由虚拟机负责对象分配和释放.也就是说,开发人员使用C++编写代码时,要自己负责对象分配和释放.WebKit和Chromium都是使用C++开发的,因此它们也面临上述问题.在解决对象释放问题时,要做到在对象不需要时自动释放,因为手动释放会带来忘记释放或者释放后又继续使用的隐患.智能指针是实现对象自动释放的有效技术手段.本文就分析Chromium和WebKit的智能指针的实现. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在现实中,

Binder学习笔记(十一)—— 智能指针

轻量级指针 Binder的学习历程爬到驱动的半山腰明显感觉越来越陡峭,停下业务层的学习,补补基础层知识吧,这首当其冲的就是智能指针了,智能指针的影子在Android源码中随处可见.打开frameworkds/rs/cpp/util,RefBase.h和StrongPointer.h两个文件,代码多读几遍都能读懂,可是串起来总感觉摸不到骨架,把不住主线.闭上眼零零星星的点串不成一条线.究其原因应该是此处使用了模式,最好先剔除掉业务层的皮肉,把模式的骨架摸个门清,再回来看代码就会势如破竹了. 不是多

[深入理解Android卷一全文-第一章]阅读前的准备工作

由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. (出版社排版好的PDF版正在向出版社申请,到时候会通过CSDN下载资源发布) 第一章  阅读前的准备工作 本章主要内容 本章简单介绍Android系统架构.编译环境的搭建以及一些工具的使用. 1.1  系统架构 1.1.1  Android系统架构 Android是Google公司推出的一款手机开发平台.该平