VPP代码阅读中文注解(二)

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值记录到全局变量里面。

猜你喜欢

转载自blog.csdn.net/weixin_40870382/article/details/83070091