clib_mem_init_thread_safe有2个版本。
其中一个在mem_mheap.c中
void *
clib_mem_init_thread_safe (void *memory, uword memory_size)
{
mheap_t *h;
u8 *heap;
clib_mem_init (memory, memory_size);
heap = clib_mem_get_per_cpu_heap ();
ASSERT (heap);
h = mheap_header (heap);
/* make the main heap thread-safe */
h->flags |= MHEAP_FLAG_THREAD_SAFE;
return heap;
}
这里clib_mem_init内部会申请到内存,并将内存地址记录到全局变量里面
clib_mem_get_per_cpu_heap再从全局变量里面读取出来。
h为所申请到内存的头部。
另外一个版本在mem_dlmalloc.c中
void *
clib_mem_init_thread_safe (void *memory, uword memory_size)
{
return clib_mem_init (memory, memory_size);
}
/* Initialize CLIB heap based on memory/size given by user.
Set memory to 0 and CLIB will try to allocate its own heap. */
void *
clib_mem_init (void *memory, uword memory_size)
{
u8 *heap;
if (memory)
{
heap = create_mspace_with_base (memory, memory_size, 1 /* locked */ );
mspace_disable_expand (heap);
}
else
heap = create_mspace (memory_size, 1 /* locked */ );
clib_mem_set_heap (heap);
if (mheap_trace_main.lock == 0)
clib_spinlock_init (&mheap_trace_main.lock);
return heap;
}
可以看出,本模块又委托mspace模块来管理内存。并划分为可动态扩展和不可动态扩展
clib_mem_set_heap会把heap值记录到全局变量里面。