blueloveTH 2 years ago
parent
commit
9c854662e2
3 changed files with 19 additions and 13 deletions
  1. 2 0
      include/pocketpy/memory.h
  2. 2 0
      src/gc.cpp
  3. 15 13
      src/memory.cpp

+ 2 - 0
include/pocketpy/memory.h

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

+ 2 - 0
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;
     }
 

+ 15 - 13
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();
+}
+
 }