From ddd99b121fda8f8842ec296e8e0ae8880c191478 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Mon, 30 Jun 2025 00:44:07 +0800 Subject: [PATCH] tweak gc --- src/interpreter/heap.c | 7 ++++--- src/interpreter/vmx.c | 5 ++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/interpreter/heap.c b/src/interpreter/heap.c index e50aaceb..fda17b6d 100644 --- a/src/interpreter/heap.c +++ b/src/interpreter/heap.c @@ -33,25 +33,26 @@ void ManagedHeap__dtor(ManagedHeap* self) { void ManagedHeap__collect_if_needed(ManagedHeap* self) { if(!self->gc_enabled) return; if(self->gc_counter < self->gc_threshold) return; - self->gc_counter = 0; int freed = ManagedHeap__collect(self); // adjust `gc_threshold` based on `freed_ma` self->freed_ma[0] = self->freed_ma[1]; self->freed_ma[1] = self->freed_ma[2]; self->freed_ma[2] = freed; 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; 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, // new_threshold); self->gc_threshold = c11__min(c11__max(new_threshold, lower), upper); } int ManagedHeap__collect(ManagedHeap* self) { + self->gc_counter = 0; ManagedHeap__mark(self); int freed = ManagedHeap__sweep(self); + // printf("GC: collected %d objects\n", freed); return freed; } diff --git a/src/interpreter/vmx.c b/src/interpreter/vmx.c index 4334981b..4ebbcbee 100644 --- a/src/interpreter/vmx.c +++ b/src/interpreter/vmx.c @@ -123,5 +123,8 @@ py_Ref py_name2ref(py_Name name) { void PyObject__dtor(PyObject* self) { py_Dtor dtor = c11__getitem(TypePointer, &pk_current_vm->types, self->type).dtor; 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); + } } \ No newline at end of file