Chapter 26.6

This commit is contained in:
Tom Willemse 2022-08-12 18:22:49 -07:00
parent 89ffc2e60a
commit 38e4c37f0f
3 changed files with 18 additions and 1 deletions

View file

@ -9,13 +9,20 @@
#include <stdio.h>
#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
}

View file

@ -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;

View file

@ -24,6 +24,9 @@ typedef struct {
Table globals;
Table strings;
ObjUpvalue *openUpvalues;
size_t bytesAllocated;
size_t nextGC;
Obj *objects;
int grayCount;
int grayCapacity;