mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-23 13:00:17 +00:00
...
This commit is contained in:
parent
eb5be9ba41
commit
9c854662e2
@ -20,4 +20,6 @@ void* pool128_alloc(){
|
||||
return pool128_alloc(sizeof(T));
|
||||
}
|
||||
|
||||
void pools_shrink_to_fit();
|
||||
|
||||
}; // namespace pkpy
|
||||
|
@ -25,6 +25,8 @@ namespace pkpy{
|
||||
// std::cout << "GC: " << alive.size() << "/" << gen.size() << " (" << freed << " freed)" << std::endl;
|
||||
gen.clear();
|
||||
gen.swap(alive);
|
||||
// clean up pools
|
||||
pools_shrink_to_fit();
|
||||
return freed;
|
||||
}
|
||||
|
||||
|
@ -133,9 +133,8 @@ struct MemoryPool{
|
||||
Block _blocks[__MaxBlocks];
|
||||
Block* _free_list[__MaxBlocks];
|
||||
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++){
|
||||
_blocks[i].arena = this;
|
||||
_free_list[i] = &_blocks[i];
|
||||
@ -194,7 +193,6 @@ struct MemoryPool{
|
||||
void* p = arena->alloc()->data;
|
||||
if(arena->empty()){
|
||||
_arenas.pop_back();
|
||||
arena->dirty = true;
|
||||
_empty_arenas.push_back(arena);
|
||||
}
|
||||
return p;
|
||||
@ -220,20 +218,19 @@ struct MemoryPool{
|
||||
arena->dealloc(block);
|
||||
}else{
|
||||
arena->dealloc(block);
|
||||
if(arena->full() && arena->dirty){
|
||||
_arenas.erase(arena);
|
||||
delete arena;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// size_t allocated_size() {
|
||||
// size_t n = 0;
|
||||
// _arenas.apply([&n](Arena* arena){ n += arena->allocated_size(); });
|
||||
// _empty_arenas.apply([&n](Arena* arena){ n += arena->allocated_size(); });
|
||||
// return n;
|
||||
// }
|
||||
void shrink_to_fit(){
|
||||
PK_GLOBAL_SCOPE_LOCK();
|
||||
_arenas.apply([this](Arena* arena){
|
||||
if(arena->full()){
|
||||
delete arena;
|
||||
_arenas.erase(arena);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
~MemoryPool(){
|
||||
_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_dealloc(void* p){ pool128.dealloc(p); }
|
||||
|
||||
void pools_shrink_to_fit(){
|
||||
pool64.shrink_to_fit();
|
||||
pool128.shrink_to_fit();
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user