blueloveTH 8 hónapja
szülő
commit
ddd99b121f
2 módosított fájl, 8 hozzáadás és 4 törlés
  1. 4 3
      src/interpreter/heap.c
  2. 4 1
      src/interpreter/vmx.c

+ 4 - 3
src/interpreter/heap.c

@@ -33,25 +33,26 @@ void ManagedHeap__dtor(ManagedHeap* self) {
 void ManagedHeap__collect_if_needed(ManagedHeap* self) {
 void ManagedHeap__collect_if_needed(ManagedHeap* self) {
     if(!self->gc_enabled) return;
     if(!self->gc_enabled) return;
     if(self->gc_counter < self->gc_threshold) return;
     if(self->gc_counter < self->gc_threshold) return;
-    self->gc_counter = 0;
     int freed = ManagedHeap__collect(self);
     int freed = ManagedHeap__collect(self);
     // adjust `gc_threshold` based on `freed_ma`
     // adjust `gc_threshold` based on `freed_ma`
     self->freed_ma[0] = self->freed_ma[1];
     self->freed_ma[0] = self->freed_ma[1];
     self->freed_ma[1] = self->freed_ma[2];
     self->freed_ma[1] = self->freed_ma[2];
     self->freed_ma[2] = freed;
     self->freed_ma[2] = freed;
     int avg_freed = (self->freed_ma[0] + self->freed_ma[1] + self->freed_ma[2]) / 3;
     int avg_freed = (self->freed_ma[0] + self->freed_ma[1] + self->freed_ma[2]) / 3;
-    const int upper = PK_GC_MIN_THRESHOLD * 8;
+    const int upper = PK_GC_MIN_THRESHOLD * 16;
     const int lower = PK_GC_MIN_THRESHOLD / 2;
     const int lower = PK_GC_MIN_THRESHOLD / 2;
     float free_ratio = (float)avg_freed / self->gc_threshold;
     float free_ratio = (float)avg_freed / self->gc_threshold;
-    int new_threshold = self->gc_threshold * (1 / free_ratio);
+    int new_threshold = self->gc_threshold * (1.5f / free_ratio);
     // printf("gc_threshold=%d, avg_freed=%d, new_threshold=%d\n", self->gc_threshold, avg_freed,
     // printf("gc_threshold=%d, avg_freed=%d, new_threshold=%d\n", self->gc_threshold, avg_freed,
     // new_threshold);
     // new_threshold);
     self->gc_threshold = c11__min(c11__max(new_threshold, lower), upper);
     self->gc_threshold = c11__min(c11__max(new_threshold, lower), upper);
 }
 }
 
 
 int ManagedHeap__collect(ManagedHeap* self) {
 int ManagedHeap__collect(ManagedHeap* self) {
+    self->gc_counter = 0;
     ManagedHeap__mark(self);
     ManagedHeap__mark(self);
     int freed = ManagedHeap__sweep(self);
     int freed = ManagedHeap__sweep(self);
+    // printf("GC: collected %d objects\n", freed);
     return freed;
     return freed;
 }
 }
 
 

+ 4 - 1
src/interpreter/vmx.c

@@ -123,5 +123,8 @@ py_Ref py_name2ref(py_Name name) {
 void PyObject__dtor(PyObject* self) {
 void PyObject__dtor(PyObject* self) {
     py_Dtor dtor = c11__getitem(TypePointer, &pk_current_vm->types, self->type).dtor;
     py_Dtor dtor = c11__getitem(TypePointer, &pk_current_vm->types, self->type).dtor;
     if(dtor) dtor(PyObject__userdata(self));
     if(dtor) dtor(PyObject__userdata(self));
-    if(self->slots == -1) NameDict__dtor(PyObject__dict(self));
+    if(self->slots == -1) {
+        NameDict* dict = PyObject__dict(self);
+        NameDict__dtor(dict);
+    }
 }
 }