outline GC steps

This commit is contained in:
dzaima 2024-09-13 18:40:36 +03:00
parent 66f37aa299
commit bd6d40a4fa
2 changed files with 26 additions and 13 deletions

View File

@ -46,7 +46,7 @@ static void gc_resetTag(Value* x) {
x->mmInfo&= 0x7F;
}
void gc_visitRoots() {
NOINLINE void gc_visitRoots() {
for (u32 i = 0; i < gc_rootSz; i++) gc_roots[i]();
for (u32 i = 0; i < gc_rootObjSz; i++) mm_visitP(gc_rootObjs[i]);
for (u32 i = 0; i < gc_rootBRefsSz; i++) mm_visit(*gc_rootBRefs[i]);
@ -145,24 +145,38 @@ static void gcv2_unmark_visit(Value* x) {
mm_visitP(x);
}
static NOINLINE void gc_run_toplevel_1() {
mm_forHeap(gc_resetTag);
}
static NOINLINE void gc_run_nontoplevel_1() {
visit_mode = GC_DEC_REFC;
mm_forHeap(gcv2_unmark_visit);
}
static NOINLINE void gc_run_nontoplevel_2() {
visit_mode = GC_MARK;
mm_forHeap(gc_visitRefcNonzero);
}
static NOINLINE void gc_run_nontoplevel_3() {
visit_mode = GC_INC_REFC;
mm_forHeap(gcv2_visit);
}
static NOINLINE void gc_run_tryFree() {
mm_forHeap(gc_tryFree);
}
static void gc_run(bool toplevel) {
if (toplevel) {
mm_forHeap(gc_resetTag);
gc_run_toplevel_1();
} else {
visit_mode = GC_DEC_REFC;
mm_forHeap(gcv2_unmark_visit);
visit_mode = GC_MARK;
mm_forHeap(gc_visitRefcNonzero);
visit_mode = GC_INC_REFC;
mm_forHeap(gcv2_visit);
gc_run_nontoplevel_1();
gc_run_nontoplevel_2();
gc_run_nontoplevel_3();
}
visit_mode = GC_MARK;
gc_visitRoots();
mm_forHeap(gc_tryFree);
gc_run_tryFree();
mm_freeFreedAndMerge();
}
#endif

View File

@ -1,4 +1,3 @@
#include "../utils/file.h"
#include "../utils/interrupt.h"
#define AllocInfo BN(AllocInfo)
#define buckets BN(buckets)
@ -139,7 +138,7 @@ void BN(forFreedHeap)(V2v f) {
}
}
#if ALLOC_MODE==0 && ENABLE_GC
static void BN(freeFreedAndMerge)() {
static NOINLINE void BN(freeFreedAndMerge)() {
for (u64 i = 0; i < 64; i++) buckets[i] = NULL;
for (u64 i = 0; i < alSize; i++) {