diff --git a/clox/src/memory.c b/clox/src/memory.c index c639b65..d1e0c5a 100644 --- a/clox/src/memory.c +++ b/clox/src/memory.c @@ -9,13 +9,20 @@ #include #endif +#define GC_HEAP_GROW_FACTOR 2 + void *reallocate(void *pointer, size_t oldSize, size_t newSize) { + vm.bytesAllocated += newSize - oldSize; if (newSize > oldSize) { #ifdef DEBUG_STRESS_GC collectGarbage(); #endif } + if (vm.bytesAllocated > vm.nextGC) { + collectGarbage(); + } + if (newSize == 0) { free(pointer); return NULL; @@ -175,6 +182,7 @@ static void sweep() { void collectGarbage() { #ifdef DEBUG_LOG_GC printf("-- gc begin\n"); + size_t before = vm.bytesAllocated; #endif markRoots(); @@ -182,8 +190,12 @@ void collectGarbage() { tableRemoveWhite(&vm.strings); sweep(); + vm.nextGC = vm.bytesAllocated * GC_HEAP_GROW_FACTOR; + #ifdef DEBUG_LOG_GC - printf("-- gd end\n"); + printf("-- gc end\n"); + printf(" collected %zu bytes (from %zu to %zu) next at %zu\n", + before - vm.bytesAllocated, before, vm.bytesAllocated, vm.nextGC); #endif } diff --git a/clox/src/vm.c b/clox/src/vm.c index 6dfd600..c9556b2 100644 --- a/clox/src/vm.c +++ b/clox/src/vm.c @@ -55,6 +55,8 @@ static void defineNative(const char *name, NativeFn function) { void initVM() { resetStack(); vm.objects = NULL; + vm.bytesAllocated = 0; + vm.nextGC = 1024 * 1024; vm.grayCount = 0; vm.grayCapacity = 0; diff --git a/clox/src/vm.h b/clox/src/vm.h index 61fe45a..e108daa 100644 --- a/clox/src/vm.h +++ b/clox/src/vm.h @@ -24,6 +24,9 @@ typedef struct { Table globals; Table strings; ObjUpvalue *openUpvalues; + + size_t bytesAllocated; + size_t nextGC; Obj *objects; int grayCount; int grayCapacity;