mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-23 21:10:19 +00:00
tweak gc
This commit is contained in:
parent
f9f74b7b12
commit
ddd99b121f
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user