.
This commit is contained in:
30
lib/heap.c
30
lib/heap.c
@@ -84,6 +84,36 @@ static size_t heap_size(Heap* h)
|
|||||||
return kh_size(h->items);
|
return kh_size(h->items);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// GC
|
||||||
|
//
|
||||||
|
|
||||||
|
KHASH_MAP_INIT_INT(MARK, bool)
|
||||||
static void heap_gc(Heap* h, VALUE const* roots, size_t n_roots)
|
static void heap_gc(Heap* h, VALUE const* roots, size_t n_roots)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
// mark
|
||||||
|
//
|
||||||
|
|
||||||
|
khash_t(MARK) *marked = kh_init(MARK);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n_roots; ++i) {
|
||||||
|
if (value_type(roots[i]) == TT_STRING) {
|
||||||
|
int ret;
|
||||||
|
khiter_t k = kh_put(MARK, marked, value_idx(roots[i]), &ret);
|
||||||
|
kh_value(marked, k) = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// sweep
|
||||||
|
//
|
||||||
|
|
||||||
|
for (khiter_t k = kh_begin(marked); k != kh_end(marked); ++k) {
|
||||||
|
HEAP_KEY key = kh_value(marked, k);
|
||||||
|
khiter_t item = kh_get(HEAP, h->items, key);
|
||||||
|
kh_del(HEAP, h->items, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
kh_destroy(MARK, marked);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user