aboutsummaryrefslogtreecommitdiff
path: root/runtime/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-16 15:00:22 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-16 15:00:22 +0000
commitc9a490e81469b0722ee62c06f14cdd083cb8a9da (patch)
tree234d1fbaffa975192c234ed6efb4e03a667b931b /runtime/src
parent713c0f6f854be3c52e1c8a53089b043148877159 (diff)
Add mark function
Diffstat (limited to 'runtime/src')
-rw-r--r--runtime/src/gc.c19
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;
}
+