From 494c13f3d8282d27a01eb2a037f2bbfe7fd059d4 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 2 May 2021 14:08:54 +0300 Subject: [PATCH] =?UTF-8?q?gc=20on=202=C3=97previous?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gc.c | 4 +++- src/h.h | 2 ++ src/main.c | 3 ++- src/mm_buddyTemplate.c | 2 ++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/gc.c b/src/gc.c index 491de0dc..fc0047ff 100644 --- a/src/gc.c +++ b/src/gc.c @@ -82,6 +82,7 @@ void gc_visitRoots() { for (u32 i = 0; i < gc_rootSz; i++) gc_roots[i](); for (u32 i = 0; i < gc_rootObjSz; i++) mm_visit(gc_rootObjs[i]); } +u64 gc_lastAlloc; void gc_forceGC() { #ifdef LOG_GC u64 start = nsTime(); @@ -95,9 +96,10 @@ void gc_forceGC() { #ifdef LOG_GC fprintf(stderr, "GC kept %ldB from %ld objects, freed %ldB from %ld objects; took %.3fms\n", gc_visitBytes, gc_visitCount, gc_freedBytes, gc_freedCount, (nsTime()-start)/1e6); #endif + gc_lastAlloc = allocB; } void gc_maybeGC() { - if (!gc_depth) gc_forceGC(); + if (!gc_depth && allocB > gc_lastAlloc*2) gc_forceGC(); } diff --git a/src/h.h b/src/h.h index e6b34c89..81eff1f3 100644 --- a/src/h.h +++ b/src/h.h @@ -480,3 +480,5 @@ static inline u64 nsTime() { // clock_gettime(CLOCK_REALTIME, &t); return t.tv_sec*1000000000ull + t.tv_nsec; } + +u64 allocB; // currently allocated number of bytes diff --git a/src/main.c b/src/main.c index 9abb77f1..f02cb4ab 100644 --- a/src/main.c +++ b/src/main.c @@ -239,6 +239,7 @@ int main() { // gc_add(comp); // free(c_src); // } + gc_enable(); while (CATCH) { printf("caught: "); @@ -276,7 +277,7 @@ int main() { #ifdef HEAP_VERIFY heapVerify(); #endif - gc_forceGC(); + gc_maybeGC(); #ifdef DEBUG #endif } diff --git a/src/mm_buddyTemplate.c b/src/mm_buddyTemplate.c index 526892b8..546a4e05 100644 --- a/src/mm_buddyTemplate.c +++ b/src/mm_buddyTemplate.c @@ -66,6 +66,7 @@ void BN(free)(Value* x) { u8 b = x->mmInfo&63; ((EmptyValue*)x)->next = buckets[b]; buckets[b] = (EmptyValue*)x; + allocB-= BSZ(b); #endif x->type = t_empty; } @@ -78,6 +79,7 @@ void* BN(allocL)(u8 bucket, u8 type) { VALGRIND_MAKE_MEM_UNDEFINED(x, BSZ(bucket)); VALGRIND_MAKE_MEM_DEFINED(&x->mmInfo, 1); #endif + allocB+= BSZ(bucket); x->mmInfo = (x->mmInfo&0x7f) | gc_tagCurr; x->flags = x->extra = x->type = 0; x->refc = 1;