简介
unlink()
是一个宏,用于将某一个空闲 chunk 从其所处的 bin 中脱链。在 malloc_consolidate()
函数中将 fastbin 中的空闲 chunk 整理到 unsorted_bin,在 malloc()
函数中用于将 unsorted_bin 中的空闲 chunk 整理到 smallbin 或者 largebin,以及在 mallo()
中获得堆空间时,均有可能调用 unlink()
宏。
本文以 glibc 2.24 版本的 unlink()
宏为讲述对象,从源代码的角度简要分析 unlink()
宏的具体实现。注意,读懂此文需要读者对 Linux 平台的堆管理有基本了解,明白 bin、chunk 等基本要素的含义。
源代码
/* Take a chunk off a bin list */
#define unlink(AV, P, BK, FD) { \
FD = P->fd; \
BK = P->bk; \
if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) \
malloc_printerr (check_action, "corrupted double-linked list", P, AV); \
else { \
FD->bk = BK; \
BK->fd = FD; \
if (!in_smallbin_range (P->size) \
&& __builtin_expect (P->fd_nextsize != NULL, 0)) { \
if (__builtin_expect (P->fd_nextsize->bk_nextsize != P, 0) \
|| __builtin_expect (P->bk_nextsize->fd_nextsize !=