server 层内存管理
1 | struct Block { |
Block 的prev 指的都是历史Block, 已经分配完内存的Block
m_max_capacity 为0,表示不限制
m_allocated_size表示的使用的block 合起来的size
Block 内部结构
要求my_memory_head小于32个字节
申请block内部
其中“设置当前block” ,
1 | char *new_mem = |
插入现有blockchain
1 | new_block->prev = m_current_block->prev; |
其中有个细节, 当申请big内存时, 会将blocksize 增加1/2
这个里面有一点内存浪费逻辑
当内存不够时,并且新申请的内存小于blocksize时, 当前block会变成历史block, 历史block 基本上内存用
### Claim MEM_ROOT Claim 会对每个Block 进行Claim
而Block->claim, 主要是设置PSI 1
2
3
4
5
6
7
8
9
10void my_claim(const void *ptr) {
my_memory_header *mh;
if (ptr == NULL) return;
mh = USER_TO_HEADER(ptr);
DBUG_ASSERT(mh->m_magic == MAGIC);
mh->m_key =
PSI_MEMORY_CALL(memory_claim)(mh->m_key, mh->m_size, &mh->m_owner);
}
否则直接调用root->Clear
ClearForReuse 和Clear 主要的区别就是, 对当前block的处理, Reuse 会重新使用当前Block, 而clear会清理当前Block
Clear 1
2
3
4
5
6
7
8
9Block *start = m_current_block;
m_current_block = nullptr;
m_block_size = m_orig_block_size;
m_current_free_start = &s_dummy_target;
m_current_free_end = &s_dummy_target;
m_allocated_size = 0;
FreeBlocks(start);
1 | m_current_free_start = pointer_cast<char *>(m_current_block) + |
### Block 内部 内存申请/释放都是走my_malloc/my_free/my_realloc, 这几个函数比较简单, 就是申请一块内存,然后将内存header设置相应的数据