源码阅读笔记--memory内存管理

内存管理
支持用户自定义的、命名的对象类型,其中指定了这一类型需要分配的大小和一些标记, 例如返回前清零(PH_MEM_FLAGS_ZERO)。
全局的memtypes管理了已注册的所有memtype, 预分配1024个memtype指针。

static void memory_init(void)
{
  memtypes_size = 1024;
  memtypes = malloc(memtypes_size * sizeof(*memtypes));
  if (!memtypes) {
    memory_panic("failed to allocate memtypes array");
  }

  memory_scope = ph_counter_scope_define(NULL, "memory", 16);
  if (!memory_scope) {
    memory_panic("failed to define memory scope");
  }

每个memtype的存储结构,包含自身的结构以及自己的counter对应的scope

struct mem_type {
  ph_memtype_def_t def;
  ph_counter_scope_t *scope;
  uint8_t first_slot;
};
struct ph_memtype_def {
  // memory//
  const char *facility;
  const char *name;
  uint64_t item_size;
  unsigned flags;
};
typedef struct ph_memtype_def ph_memtype_def_t;

注册后(ph_memtype_register())得到一个类型为ph_memtype_t的“描述符”, 该描述符返回的是上述1024个的对应index下标,以后引用这个类型的时候使用的都是这个“描述符”。

每次ph_memtype_register()之后,都会创建一个对应的counter,以用来统计改内存变量的调用次数。

分配和释放的各个接口:

分配固定大小:ph_mem_alloc(mt),根据mt中记录的类型大小来分配
分配不定大小:ph_mem_alloc_size(mt, size),分配size + HEADER_RESERVATION。这个header中记录了本次分配的大小和memtype
释放:ph_mem_free(mt, ptr),根据memtype或header来释放
用ph_mem_stats类型和相应的接口来维护、查询某个类型的内存分配信息。

你可能感兴趣的:(源码阅读笔记--memory内存管理)