outline GC steps
This commit is contained in:
parent
66f37aa299
commit
bd6d40a4fa
36
src/opt/gc.c
36
src/opt/gc.c
@ -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
|
||||
|
||||
@ -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++) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user