Glibc内存储器管理-ptmalloc2源代码分析(十七)
Glibc内存管理--ptmalloc2源代码分析(十七)
5.4 配置选项
Ptmalloc的配置选项不多,在 3.2.6 节已经做过概要描述,这里给出 mallopt() 函数的实现:
#if __STD_C int mALLOPt(int param_number, int value) #else int mALLOPt(param_number, value) int param_number; int value; #endif { mstate av = &main_arena; int res = 1; if(__malloc_initialized < 0) ptmalloc_init (); (void)mutex_lock(&av->mutex); /* Ensure initialization/consolidation */ malloc_consolidate(av); switch(param_number) { case M_MXFAST: if (value >= 0 && value <= MAX_FAST_SIZE) { set_max_fast(value); } else res = 0; break; case M_TRIM_THRESHOLD: mp_.trim_threshold = value; mp_.no_dyn_threshold = 1; break; case M_TOP_PAD: mp_.top_pad = value; mp_.no_dyn_threshold = 1; break; case M_MMAP_THRESHOLD: #if USE_ARENAS /* Forbid setting the threshold too high. */ if((unsigned long)value > HEAP_MAX_SIZE/2) res = 0; else #endif mp_.mmap_threshold = value; mp_.no_dyn_threshold = 1; break; case M_MMAP_MAX: #if !HAVE_MMAP if (value != 0) res = 0; else #endif mp_.n_mmaps_max = value; mp_.no_dyn_threshold = 1; break; case M_CHECK_ACTION: check_action = value; break; case M_PERTURB: perturb_byte = value; break; #ifdef PER_THREAD case M_ARENA_TEST: if (value > 0) mp_.arena_test = value; break; case M_ARENA_MAX: if (value > 0) mp_.arena_max = value; break; #endif } (void)mutex_unlock(&av->mutex); return res; }
Mallopt() 所设置的字段在 5.3.2 节中做过详细介绍,这里不再作详细分析,需要提一下的是,在 mallopt() 函数配置前,需要检查主分配区是否初始化了,如果没有初始化,调用 ptmalloc_init() 函数初始化 ptmalloc ,然后获得主分配区的锁,调用 malloc_consolidate() 函数, malloc_consolidate() 函数会判断 主分配区是否已经 初始化 ,如果没有,则初始化主分配区。同时我们也看到, mp_ 都没有锁,对 mp_ 中参数字段的修改,是通过主分配区的锁来同步的。