diff --git a/include/pocketpy/memory.h b/include/pocketpy/memory.h index befe63b4..a8d4fcd2 100644 --- a/include/pocketpy/memory.h +++ b/include/pocketpy/memory.h @@ -20,4 +20,6 @@ void* pool128_alloc(){ return pool128_alloc(sizeof(T)); } +void pools_shrink_to_fit(); + }; // namespace pkpy diff --git a/src/gc.cpp b/src/gc.cpp index d68e3998..d28860e4 100644 --- a/src/gc.cpp +++ b/src/gc.cpp @@ -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; } diff --git a/src/memory.cpp b/src/memory.cpp index 09f73dd8..15118817 100644 --- a/src/memory.cpp +++ b/src/memory.cpp @@ -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(); +} + } \ No newline at end of file