aboutsummaryrefslogtreecommitdiff
path: root/runtime/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-03-19 16:34:27 +0000
committerMichael Williamson <mike@zwobble.org>2024-03-19 16:34:27 +0000
commit812d7c7992a09c1ef0fec9c00108540462d06211 (patch)
treecc081b23f6b0f36b0643572b2b2809b5dc945b45 /runtime/src
parent35b923b9f820653525a033f8ab2006ba1cb8c65c (diff)
Extract common GC code
Diffstat (limited to 'runtime/src')
-rw-r--r--runtime/src/shed/gc.c42
-rw-r--r--runtime/src/shed/gc.h32
-rw-r--r--runtime/src/shed/gc/mark-and-sweep/gc.c43
3 files changed, 70 insertions, 47 deletions
diff --git a/runtime/src/shed/gc.c b/runtime/src/shed/gc.c
new file mode 100644
index 00000000..b11b2bd7
--- /dev/null
+++ b/runtime/src/shed/gc.c
@@ -0,0 +1,42 @@
+#include <stdbool.h>
+
+#include "./gc.h"
+#include "./primitives.h"
+#include "./std/unistd.h"
+
+// == GC objects ==
+
+bool shed__runtime__gc_is_gc_object(ShedObject object) {
+ // Check that the object is not one of:
+ // * unit (0)
+ // * false (0)
+ // * true (1)
+ return !(object == 0 || object == 1);
+}
+
+// == Roots ==
+
+ShedGcRootIndex shed__runtime__gc_root_stack_index = 0;
+
+struct ShedGcObjectHeader* shed__runtime__gc_root_stack[16384];
+
+ShedGcRootIndex shed__runtime__gc_get_root_stack_index() {
+ return shed__runtime__gc_root_stack_index;
+}
+
+void shed__runtime__gc_set_root_stack_index(ShedGcRootIndex new_shed__runtime__gc_root_stack_index) {
+ shed__runtime__gc_root_stack_index = new_shed__runtime__gc_root_stack_index;
+}
+
+void shed__runtime__gc_push_root_gc_object(struct ShedGcObjectHeader* gc_root) {
+ shed__runtime__gc_root_stack[shed__runtime__gc_root_stack_index] = gc_root;
+ shed__runtime__gc_root_stack_index++;
+}
+
+void shed__runtime__gc_push_root(ShedObject gc_root) {
+ if (!shed__runtime__gc_is_gc_object(gc_root)) {
+ return;
+ }
+
+ shed__runtime__gc_push_root_gc_object((struct ShedGcObjectHeader*) gc_root);
+}
diff --git a/runtime/src/shed/gc.h b/runtime/src/shed/gc.h
index 9e39e7b7..ba1c98a4 100644
--- a/runtime/src/shed/gc.h
+++ b/runtime/src/shed/gc.h
@@ -1,15 +1,13 @@
#ifndef SHED_GC_H
#define SHED_GC_H
-#include "./std/unistd.h"
+#include <stdbool.h>
#include "../patio/patio.h"
+#include "./std/unistd.h"
+#include "./primitives.h"
-struct ShedGcObjectHeader {
- struct ShedGcObjectHeader* next;
- uint32_t mark;
- uint32_t runtime_type_tag;
-};
+// == Runtime types ==
struct RuntimeType {
uint32_t children_offset;
@@ -18,6 +16,28 @@ struct RuntimeType {
extern struct RuntimeType shed__rtti[];
+// == GC objects ==
+
+struct ShedGcObjectHeader {
+ struct ShedGcObjectHeader* next;
+ uint32_t mark;
+ uint32_t runtime_type_tag;
+};
+
+bool shed__runtime__gc_is_gc_object(ShedObject object);
+
+// == Roots ==
+
+typedef size_t ShedGcRootIndex;
+
+extern ShedGcRootIndex shed__runtime__gc_root_stack_index;
+
+extern struct ShedGcObjectHeader* shed__runtime__gc_root_stack[];
+
+void shed__runtime__gc_push_root_gc_object(struct ShedGcObjectHeader* gc_root);
+
+// == Allocation ==
+
void* shed__runtime__gc_alloc(size_t size, uint32_t runtime_type_tag);
#endif
diff --git a/runtime/src/shed/gc/mark-and-sweep/gc.c b/runtime/src/shed/gc/mark-and-sweep/gc.c
index e6cbc0fa..40ffa98b 100644
--- a/runtime/src/shed/gc/mark-and-sweep/gc.c
+++ b/runtime/src/shed/gc/mark-and-sweep/gc.c
@@ -5,16 +5,6 @@
#include "../../primitives.h"
#include "../../std/malloc.h"
-// == GC objects ==
-
-bool is_gc_object(ShedObject object) {
- // Check that the object is not one of:
- // * unit (0)
- // * false (0)
- // * true (1)
- return !(object == 0 || object == 1);
-}
-
// == Marking ==
// The mark value for each object is initialized to 0. Each mark phase
@@ -49,35 +39,6 @@ void mark(struct ShedGcObjectHeader* object) {
}
}
-// == Roots ==
-
-typedef size_t ShedGcRootIndex;
-
-ShedGcRootIndex gc_root_stack_index = 0;
-
-struct ShedGcObjectHeader* gc_root_stack[16384];
-
-ShedGcRootIndex shed__runtime__gc_get_root_stack_index() {
- return gc_root_stack_index;
-}
-
-void shed__runtime__gc_set_root_stack_index(ShedGcRootIndex new_gc_root_stack_index) {
- gc_root_stack_index = new_gc_root_stack_index;
-}
-
-static void shed__runtime__gc_push_root_gc_object(struct ShedGcObjectHeader* gc_root) {
- gc_root_stack[gc_root_stack_index] = gc_root;
- gc_root_stack_index++;
-}
-
-void shed__runtime__gc_push_root(ShedObject gc_root) {
- if (!is_gc_object(gc_root)) {
- return;
- }
-
- shed__runtime__gc_push_root_gc_object((struct ShedGcObjectHeader*) gc_root);
-}
-
// == Allocation ==
struct ShedGcObjectHeader* first = NULL;
@@ -102,8 +63,8 @@ void* shed__runtime__gc_alloc(size_t size, uint32_t runtime_type_tag) {
// == Collection ==
void mark_reachable() {
- for (size_t i = 0; i < gc_root_stack_index; i++) {
- mark(gc_root_stack[i]);
+ for (size_t i = 0; i < shed__runtime__gc_root_stack_index; i++) {
+ mark(shed__runtime__gc_root_stack[i]);
}
}