heap - 6 - __libc_malloc 源码及其部分分析

调用malloc后首执行的函数 —— __libc_malloc!

所有的分析都以注释的形式添加进源代码中,方便阅读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void *
__libc_malloc (size_t bytes)
{
mstate ar_ptr; // 指向arena的指针
void *victim; // 指向待分配chunk的指针

// 判断 __malloc_hook 是否为空
// 如果不为空,则返回 其执行 __malloc_hook指向函数的返回值
void *(*hook) (size_t, const void *)
= atomic_forced_read (__malloc_hook);
if (__builtin_expect (hook != NULL, 0))
return (*hook)(bytes, RETURN_ADDRESS (0));

// 获取arena并上线程锁
arena_get (ar_ptr, bytes);

// 执行核心内存分配函数,并获得所分配的chunk地址
victim = _int_malloc (ar_ptr, bytes);

// 如果当前arena不为空,但分配不到chunk
// 则更换可用arena并尝试重新分配chunk
if (!victim && ar_ptr != NULL)
{
LIBC_PROBE (memory_malloc_retry, 1, bytes);
ar_ptr = arena_get_retry (ar_ptr, bytes);
victim = _int_malloc (ar_ptr, bytes);
}

// 如果arena不为空,则解除arena上的线程锁
if (ar_ptr != NULL)
(void) mutex_unlock (&ar_ptr->mutex);

// 判断条件,若不满足指定条件则断言出错
assert (!victim || chunk_is_mmapped (mem2chunk (victim)) ||
ar_ptr == arena_for_chunk (mem2chunk (victim)));
return victim;
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2024 Kiprey
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~