From c9a490e81469b0722ee62c06f14cdd083cb8a9da Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 16 Dec 2023 15:00:22 +0000 Subject: Add mark function --- runtime/src/gc.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'runtime/src') diff --git a/runtime/src/gc.c b/runtime/src/gc.c index b55dc03b..08c39cf9 100644 --- a/runtime/src/gc.c +++ b/runtime/src/gc.c @@ -4,6 +4,8 @@ #include "./alloc.h" #include "./gc.h" +// == Marking == + // The mark value for each object is initialized to 0. Each mark phase // alternates between using 0b010 and 0b100 as the mark value. We check only for // the bit set to 1, meaning static values can have a mark value of 0b110 to be @@ -18,6 +20,22 @@ bool is_marked(struct ShedGcObjectHeader* object) { return (object->mark & current_mark_value) == current_mark_value; } +void mark(struct ShedGcObjectHeader* object) { + if (is_marked(object)) { + return; + } + + object->mark = current_mark_value; + + struct ShedGcObjectHeader** children = (struct ShedGcObjectHeader**) (((void*) object) + object->children_offset); + + for (size_t child_index = 0; child_index < object->children_count; child_index++) { + mark(children[child_index]); + } +} + +// == Allocation == + struct ShedGcObjectHeader* first = NULL; void* shed__runtime__gc_alloc(size_t size, size_t children_offset, size_t children_count) { @@ -31,3 +49,4 @@ void* shed__runtime__gc_alloc(size_t size, size_t children_offset, size_t childr return object; } + -- cgit v1.2.3