struct ref_entry
{
ref_entry* next;
const void* id;
int32_t ref;
};
void addRef(ref_entry** refs, const void* id, int32_t mRef)
{
if (mTrackEnabled) {
AutoMutex _l(mMutex);
ref_entry* ref = new ref_entry;
ref->ref = mRef;
ref->id = id;
ref->next = *refs;
*refs = ref;
/*
新出现的ref_entry结构体加入到链表头上,如果有n个sp指针指向同一个目标对象
那么这里就有n个ref_entry结构体加入到这个单链表中,该结构体记录着如下数据
1. id域记录着对应的sp强指针类对象的this值
2. ref域记录的是当前sp强指针类对象是第几个引用目标对象的指针
3. next域指向下一个指向目标对象的sp强指针对应的ref_entry结构体
类RefBase的嵌套类weakref_type的子类的私有数据mRefs的私有二级指针成员mWeakRefs指向的是
最后一个sp强指针对应的ref_entry结构体指针。
总结一下:
一个目标对象,可能被n个sp强指针指向,那么就存在n个class sp对象,同时每一个sp
对象在目标对象的虚基类对象的成员类mRefs的私有二级指针成员mWeakRefs登记了一个
ref_entry结构体,这些ref_entry结构体的地址都是由该链表管理,每一个
ref_entry结构体和哪一个sp对象对应,也由该链表管理。同时链接数就是该链表节点的
个数
*/
}
}
/************************注释1********************************/
/************************注释2********************************/
void RefBase::weakref_type::incWeak(const void* id)
{
weakref_impl* const impl = static_cast<weakref_impl*>(this);
// 强制类型转换,将基类指针转换成子类指针
impl->addWeakRef(id);
// 调用类weakref_impl成员函数addWeakRef(),产生一个ref_entry结构体挂载mWeakRefs链表上
const int32_t c = android_atomic_inc(&impl->mWeak);
/* impl->mWeak加1,表示已存在一个weak引用。但返回值c为操作前的结果 */
LOG_ASSERT(c >= 0, "incWeak called on %p after last weak ref", this);
}
/************************注释2********************************/