-
在weakEntry里面,referent 和 referrer 是一对多的关系
-
referrer 少于2个是数组, 多余2个则变成了长度初始值为4的哈希表
-
之所以4位节点,是因为四字节对齐CPU访问更加快速
-
sidetable是利用了分离锁优化的
-
weak 细分分为 5种情况,每种都要说
-
referrer 是 地址指针,之所以使用了地址指针才能解除死循环
-
referent 查找 sidetable使用的 哈希查找,referent查找weaktable也是用的哈希查找。 但是这两个的哈希算法不一样
-
init 、 store 、 destory 都是同一个方法的不同模板调用
-
entry 在变为 哈希表的情况下 为什么 mask是64 而不是 3 ?
第一次会触发下面的函数调用
static void weak_resize(weak_table_t *weak_table, size_t new_size)
{
size_t old_size = TABLE_SIZE(weak_table);
weak_entry_t *old_entries = weak_table->weak_entries;
weak_entry_t *new_entries = (weak_entry_t *)
calloc(new_size, sizeof(weak_entry_t));
weak_table->mask = new_size - 1;
weak_table->weak_entries = new_entries;
weak_table->max_hash_displacement = 0;
weak_table->num_entries = 0; // restored by weak_entry_insert below
if (old_entries) {
weak_entry_t *entry;
weak_entry_t *end = old_entries + old_size;
for (entry = old_entries; entry < end; entry++) {
if (entry->referent) {
weak_entry_insert(weak_table, entry);
}
}
free(old_entries);
}
}
因为,当超过3个的时候,会直接出发扩容,表长度由4直接扩容到8,mask = count - 1 也就是8-1为7
-
destory 和 weak_clear_no_lock() 的区别在于一个左边 一个右边
-
location = referrer, newObj = referent