diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-16 15:00:22 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-16 15:00:22 +0000 |
| commit | c9a490e81469b0722ee62c06f14cdd083cb8a9da (patch) | |
| tree | 234d1fbaffa975192c234ed6efb4e03a667b931b /runtime/src | |
| parent | 713c0f6f854be3c52e1c8a53089b043148877159 (diff) | |
Add mark function
Diffstat (limited to 'runtime/src')
| -rw-r--r-- | runtime/src/gc.c | 19 |
1 files changed, 19 insertions, 0 deletions
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; } + |
