contributed by < terry23304
>
根據電腦結構設定 word_size
,header_size = sizeof(block_t)
更好理解
pool_init
檢查傳入的 address 是否合法與大小是否大於 block_t
的大小,若通過則用 current->size
紀錄可用空間, current->size
要減去儲存 size
的大小, current->prev
、 current->next
因為是指向 NULL
所以不占空間。
round_up
確保空間為 word_size
的倍數,原本的寫法在 32 位元時不成立
get_loc_to_place
找到可以配置的空間
先確認 current
size 夠不夠大,因為是 first-fit,找到就直接 retrun
往前找
往後找,原本是 parse = ((block_t *) current)->prev
, 會重複檢查 current->prev
跟 current
,應為 parse = ((block_t *) current)->next
pool_malloc
先把大小補到 word_size
的倍數後,找到可配置的空間,但得到可配置空間後卻使用 current
來配置
pool_free
呼叫 get_loc_to_free
得到 free space,並檢查 block 能不能跟 free space 合併,再嘗試與前後的 block 合併
修改 first-fit 成 best-fit
用 rbnode
儲存各個 block 的資訊
TODO: 討論使用紅黑樹實作 free list 的好處和考量因素
走訪紅黑樹找到最接近且大於 size 的 node
把 node
從 freed_list
中刪除後,用 new
更新剩餘空間的大小,再插入 freed list
合併 first
、 second
free 時檢查前後是否為 freed 狀態,若則合併兩個 node
避免多個 thread 同時存取 memory block