This commit is contained in:
blueloveTH 2023-10-12 10:54:27 +08:00
parent eb5be9ba41
commit 9c854662e2
3 changed files with 19 additions and 13 deletions

View File

@ -20,4 +20,6 @@ void* pool128_alloc(){
return pool128_alloc(sizeof(T)); return pool128_alloc(sizeof(T));
} }
void pools_shrink_to_fit();
}; // namespace pkpy }; // namespace pkpy

View File

@ -25,6 +25,8 @@ namespace pkpy{
// std::cout << "GC: " << alive.size() << "/" << gen.size() << " (" << freed << " freed)" << std::endl; // std::cout << "GC: " << alive.size() << "/" << gen.size() << " (" << freed << " freed)" << std::endl;
gen.clear(); gen.clear();
gen.swap(alive); gen.swap(alive);
// clean up pools
pools_shrink_to_fit();
return freed; return freed;
} }

View File

@ -133,9 +133,8 @@ struct MemoryPool{
Block _blocks[__MaxBlocks]; Block _blocks[__MaxBlocks];
Block* _free_list[__MaxBlocks]; Block* _free_list[__MaxBlocks];
int _free_list_size; int _free_list_size;
bool dirty;
Arena(): _free_list_size(__MaxBlocks), dirty(false){ Arena(): _free_list_size(__MaxBlocks) {
for(int i=0; i<__MaxBlocks; i++){ for(int i=0; i<__MaxBlocks; i++){
_blocks[i].arena = this; _blocks[i].arena = this;
_free_list[i] = &_blocks[i]; _free_list[i] = &_blocks[i];
@ -194,7 +193,6 @@ struct MemoryPool{
void* p = arena->alloc()->data; void* p = arena->alloc()->data;
if(arena->empty()){ if(arena->empty()){
_arenas.pop_back(); _arenas.pop_back();
arena->dirty = true;
_empty_arenas.push_back(arena); _empty_arenas.push_back(arena);
} }
return p; return p;
@ -220,20 +218,19 @@ struct MemoryPool{
arena->dealloc(block); arena->dealloc(block);
}else{ }else{
arena->dealloc(block); arena->dealloc(block);
if(arena->full() && arena->dirty){
_arenas.erase(arena);
delete arena;
}
} }
} }
} }
// size_t allocated_size() { void shrink_to_fit(){
// size_t n = 0; PK_GLOBAL_SCOPE_LOCK();
// _arenas.apply([&n](Arena* arena){ n += arena->allocated_size(); }); _arenas.apply([this](Arena* arena){
// _empty_arenas.apply([&n](Arena* arena){ n += arena->allocated_size(); }); if(arena->full()){
// return n; delete arena;
// } _arenas.erase(arena);
}
});
}
~MemoryPool(){ ~MemoryPool(){
_arenas.apply([](Arena* arena){ delete arena; }); _arenas.apply([](Arena* arena){ delete arena; });
@ -250,4 +247,9 @@ void pool64_dealloc(void* p){ pool64.dealloc(p); }
void* pool128_alloc(size_t size){ return pool128.alloc(size); } void* pool128_alloc(size_t size){ return pool128.alloc(size); }
void pool128_dealloc(void* p){ pool128.dealloc(p); } void pool128_dealloc(void* p){ pool128.dealloc(p); }
void pools_shrink_to_fit(){
pool64.shrink_to_fit();
pool128.shrink_to_fit();
}
} }