记录一下,看源码的时候也不用到处翻了
- bin_at
#define bin_at(m, i) \
(mbinptr) (((char *) &((m)->bins[((i) - 1) * 2])) \
- offsetof (struct malloc_chunk, fd))
宏 bin_at(m, i) 通过 bin index 获得 bin 的链表头,m 指的是分配区,i 是索引
- unsorted_chunks
#define unsorted_chunks(M) (bin_at (M, 1))
由于 unsorted_chunks 是第一个 bin 所以 索引始终为 1
- binmap
#define NBINS 128
#define BINMAPSHIFT 5
#define BITSPERMAP (1U << BINMAPSHIFT) // 32
#define BINMAPSIZE (NBINS / BITSPERMAP)// 128 / 32 = 4
unsigned int binmap[BINMAPSIZE]; // 32b * 4 = 128b
一共有 128 个 bin,0 和 127 不算,也就是有 126 个 bin,其中第一个 bin 是 unsorted_bin
binmap 字段是一个 int 数组,ptmalloc 用一个 bit 来标识该 bit 对应的 bin 中是否包含空闲 chunk
- mark_bin
#define mark_bin(m, i) ((m)->binmap[idx2block (i)] |= idx2bit (i))
mark_bin 设置第 i 个 bin 在 binmap 中对应的 bit 位为 1
- last
#define last(b) ((b)->fd)
之前没看,以为是最后一个 bin
- __glibc_unlikely
# define __glibc_unlikely(cond) __builtin_expect ((cond), 0)
与 glibc 不像的。。。条件。如果 cond 为 1, 返回 1,否则返回 0
- in_smallbin_range
#define in_smallbin_range(sz) \
((unsigned long) (sz) < (unsigned long) MIN_LARGE_SIZE)
在 SIZE_SZ 为 4B 的平台上,small bins 中的 chunk 大小是以 8B 为公差的等差数列,最大的 chunk 大小为 504B,最小的 chunk 大小为 16B,所以实际共 62 个 bin。分别为 16B、 24B、32B,„„,504B。在 SIZE_SZ 为 8B 的平台上,small bins 中的 chunk 大小是以 16B 为公差的等差数列,最大的 chunk 大小为 1008B,最小的 chunk 大小为 32B,所以实际共 62 个 bin。分别为 32B、48B、64B,„„,1008B。
- idx2block(i)
#define idx2block(i) ((i) >> BINMAPSHIFT)
可以使用宏 idx2block 计算出该 bin 在 binmap 对应的 bit 属于哪个 block。idx2bit 宏取第 i 位为 1,其它位都为 0 的掩码,举个例子:idx2bit(3) 为 “0000 1000”(只显示 8 位)。
- malloc_consolidate
这个函数非常 diao 了
没有分析过他,改天分析。。。书上说,这个函数的作用主要是合并 fastbin 中的 bin,将这些空闲 chunk 加入 unsorted bin 中。
- chunk_main_arena
#define NON_MAIN_ARENA 0x4
#define chunk_main_arena(p) (((p)->mchunk_size & NON_MAIN_ARENA) == 0)
如果 chunk size 的第三位是 1,,也就是说这个 chunk 不是主分配区。
- get_max_fast
#define set_max_fast(s) \
global_max_fast = (((s) == 0) \
? SMALLBIN_WIDTH : ((s + SIZE_SZ) & ~MALLOC_ALIGN_MASK))
#define get_max_fast() global_max_fast
看到上面有一个 set_max_fast,有这样一段代码:
set_max_fast (DEFAULT_MXFAST);
其中:
DEFAULT_MXFAST 64 (for 32bit), 128 (for 64bit)
所以一般情况下 get_max_fast() 64 (for 32bit), 128 (for 64bit)
- arena_get(ptr, size)
#define arena_get(ptr, size) do { \
ptr = thread_arena; \
arena_lock (ptr, size); \
} while (0)
得到这个线程的分配区,并且给这个分配区上锁
- smallbin_index
#define smallbin_index(sz) \
((SMALLBIN_WIDTH == 16 ? (((unsigned) (sz)) >> 4) : (((unsigned) (sz)) >> 3))\
+ SMALLBIN_CORRECTION)
- fastbin
#define fastbin(ar_ptr, idx) ((ar_ptr)->fastbinsY[idx])
返回 fastbin 地址
- chunk_at_offset
#define chunk_at_offset(p, s) ((mchunkptr) (((char *) (p)) + (s)))
当前 fastbin 的地址 + 自己的 size 就能得到下一个 chunk 的地址
- clear_fastchunks
#define clear_fastchunks(M) catomic_or (&(M)->flags, FASTCHUNKS_BIT)
清除有 fastbin chunk 的标志
- atomic_exchange_acq
读取第一个参数指针所指的值
- check_inuse_chunk
# define check_inuse_chunk(A, P)
这个就是 define 了一下其实什么都没干