outline GC steps
This commit is contained in:
parent
66f37aa299
commit
bd6d40a4fa
28
src/opt/gc.c
28
src/opt/gc.c
@ -46,7 +46,7 @@ static void gc_resetTag(Value* x) {
|
|||||||
x->mmInfo&= 0x7F;
|
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_rootSz; i++) gc_roots[i]();
|
||||||
for (u32 i = 0; i < gc_rootObjSz; i++) mm_visitP(gc_rootObjs[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]);
|
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);
|
mm_visitP(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gc_run(bool toplevel) {
|
static NOINLINE void gc_run_toplevel_1() {
|
||||||
if (toplevel) {
|
|
||||||
mm_forHeap(gc_resetTag);
|
mm_forHeap(gc_resetTag);
|
||||||
} else {
|
}
|
||||||
|
static NOINLINE void gc_run_nontoplevel_1() {
|
||||||
visit_mode = GC_DEC_REFC;
|
visit_mode = GC_DEC_REFC;
|
||||||
mm_forHeap(gcv2_unmark_visit);
|
mm_forHeap(gcv2_unmark_visit);
|
||||||
|
}
|
||||||
|
static NOINLINE void gc_run_nontoplevel_2() {
|
||||||
visit_mode = GC_MARK;
|
visit_mode = GC_MARK;
|
||||||
mm_forHeap(gc_visitRefcNonzero);
|
mm_forHeap(gc_visitRefcNonzero);
|
||||||
|
}
|
||||||
|
static NOINLINE void gc_run_nontoplevel_3() {
|
||||||
visit_mode = GC_INC_REFC;
|
visit_mode = GC_INC_REFC;
|
||||||
mm_forHeap(gcv2_visit);
|
mm_forHeap(gcv2_visit);
|
||||||
}
|
}
|
||||||
|
static NOINLINE void gc_run_tryFree() {
|
||||||
|
mm_forHeap(gc_tryFree);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gc_run(bool toplevel) {
|
||||||
|
if (toplevel) {
|
||||||
|
gc_run_toplevel_1();
|
||||||
|
} else {
|
||||||
|
gc_run_nontoplevel_1();
|
||||||
|
gc_run_nontoplevel_2();
|
||||||
|
gc_run_nontoplevel_3();
|
||||||
|
}
|
||||||
|
|
||||||
visit_mode = GC_MARK;
|
visit_mode = GC_MARK;
|
||||||
gc_visitRoots();
|
gc_visitRoots();
|
||||||
|
|
||||||
mm_forHeap(gc_tryFree);
|
gc_run_tryFree();
|
||||||
mm_freeFreedAndMerge();
|
mm_freeFreedAndMerge();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
#include "../utils/file.h"
|
|
||||||
#include "../utils/interrupt.h"
|
#include "../utils/interrupt.h"
|
||||||
#define AllocInfo BN(AllocInfo)
|
#define AllocInfo BN(AllocInfo)
|
||||||
#define buckets BN(buckets)
|
#define buckets BN(buckets)
|
||||||
@ -139,7 +138,7 @@ void BN(forFreedHeap)(V2v f) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if ALLOC_MODE==0 && ENABLE_GC
|
#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 < 64; i++) buckets[i] = NULL;
|
||||||
|
|
||||||
for (u64 i = 0; i < alSize; i++) {
|
for (u64 i = 0; i < alSize; i++) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user