allocate()和deallocate()
SGI对第二配置器的allocate()和deallocate()的实现
static void* allocate(size_t __n)
{
void* __ret = 0;
//如果大于128 bytes,调用使用第一级配置器
if (__n > (size_t) _MAX_BYTES) {
__ret = malloc_alloc::allocate(__n); //之前有typedef __malloc_alloc_tempalte<0> malloc_alloc
}
else {
//寻找16个free-lists中合适的一个
_Obj* __STL_VOLATILE* __my_free_list
= _S_free_list + _S_freelist_index(__n);
# ifndef _NOTHREADS
/*REFERENCED*/
_Lock __lock_instance;
# endif
_Obj* __RESTRICT __result = *__my_free_list;
if (__result == 0)
//没找到可用的free list,准备重新填充free list
__ret = _S_refill(_S_round_up(__n));
else {
//调整free list
*__my_free_list = __result -> _M_free_list_link;
__ret = __result;
}
}
return __ret;
};
static void deallocate(void* __p, size_t __n)
{
//如果区块大于128 bytes,就调用第一配置器
if (__n > (size_t) _MAX_BYTES)
malloc_alloc::deallocate(__p, __n);
else {
//寻找对应的free list
_Obj* __STL_VOLATILE* __my_free_list
= _S_free_list + _S_freelist_index(__n);
_Obj* __q = (_Obj*)__p;
// acquire lock
# ifndef _NOTHREADS
/*REFERENCED*/
_Lock __lock_instance;
# endif /* _NOTHREADS */
//调整free list,回收区块
__q -> _M_free_list_link = *__my_free_list;
*__my_free_list = __q;
}
}