__treeint_dump()
是使用中序 (in-order) 方式印出節點。
treeint_remove()
中先使用 treeint_find()
找到目標節點,再使用 st_remove()
刪除節點。st_remove()
透過 st_replace_right()
和 st_replace_left()
來刪除節點。若要刪除的節點有右子樹,則用右子樹的最小值取代。
用節點 del
擁有右子樹為例,要刪除 del
,先找到其右子樹中最小值 least
節點,再使用 st_replace_right()
把 del
節點換為 least
,最後更新。
st_update()
的最後會比對更新後和更新前的 hint,若兩者不一樣則會往親代節點遞迴 st_update()
。
alignment
要為 2 的冪,所以 mask
是 2 進位中 0 到 n-1 位的遮罩。例如: alignment = 8,mask = 7 (0111 1111)。
(sz + mask) & ~mask
先加上 mask
,可以讓沒有對齊的數往前到下一個區塊。
用老師的例子舉例,sz
可能的值為 120 ~ 123,alignment
為 4,mask
為 3。可以知道 121 ~ 123 沒有對齊,所以先加上 mask
,值會變為 124 ~ 126,此時再和 ~mask
做 bitwise and,即可將 2 進位中最高第 3 位以下的 bits 忽略。
在 linux/tools/include/linux/mm.h 中找到類似的程式碼。舉例:linux/mm/percpu.c。
當 index
取得值後,使用 __ALIGN_MASK(index, align_mask)
來對齊,最後確認是否符合要求大小。
qsort_thread()
是讓 thread 執行的 function。在程式剛開始時,每個 thread 的狀態 qs->st
都會是 ts_idle
,這裡先讓每個 thread 停在自己的 cond。
最後只會剩一個 thread 在 qsort_mt()
,他會用 signal 方式叫醒pool[0]
。
當 pool[0]
的 thread 做完後,會再用 signal 的方式叫下一個停在 cond 上 thread 起來。