先看看gc_link的定義

比如 A->b = c,可以寫為

接下來看看gc_link的代碼
1
void
2
gc_link(void *parent,void *prev,void *now)
3

{
4
int parent_id;
5
if (parent==0)
{
6
parent_id=0;
7
}
8
else
{
9
parent_id=map_id(parent);
10
}
11
if (prev)
{
12
int prev_id=map_id(prev);
13
stack_push(prev_id);
14
node_add(parent_id,prev_id | UNSET_MASK);
15
}
16
if (now)
{
17
node_add(parent_id,map_id(now));
18
}
19
}

2

3



4

5



6

7

8



9

10

11



12

13

14

15

16



17

18

19

先看看5、6、7、8、9行,如果parent有效的話,則通過 map_id() 將它放到 E.pool中管理。可是這個parent明顯是在更早的時候分配的內(nèi)存,所以可以肯定 map_id() 在這里執(zhí)行的是查找功能,而沒有往 E.pool中做插入操作。map_id()這個函數(shù)還是可以暫時忽略不看。
parent_id即parent在 E.pool中的索引。
如果parent無效的話,parent_id = 0,這有可能說明,E.pool的第0個節(jié)點是一個特殊節(jié)點。如果parent作為整個庫分配出來的第一塊內(nèi)存的話,那么在分配的時候也就沒有什么東西可以引用他,除了這個gc庫以及應(yīng)用程序。所以制定了 E.pool[ 0 ]來表示這種引用,和他建立依賴關(guān)系的內(nèi)存,可以保持和整個gc庫一樣長的生命周期,直到gc_exit。
11、12、13、14行,是用來解除parent和prev的依賴關(guān)系的,相比16、17行建立parent和now的依賴關(guān)系,代碼有點多。所以先來看看如何建立內(nèi)存間的依賴關(guān)系。
