Chapter 26.6
This commit is contained in:
parent
89ffc2e60a
commit
38e4c37f0f
3 changed files with 18 additions and 1 deletions
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -24,6 +24,9 @@ typedef struct {
|
|||
Table globals;
|
||||
Table strings;
|
||||
ObjUpvalue *openUpvalues;
|
||||
|
||||
size_t bytesAllocated;
|
||||
size_t nextGC;
|
||||
Obj *objects;
|
||||
int grayCount;
|
||||
int grayCapacity;
|
||||
|
|
Loading…
Reference in a new issue