summaryrefslogtreecommitdiff
path: root/libguile/whippet/src/tracer.h
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/whippet/src/tracer.h')
-rw-r--r--libguile/whippet/src/tracer.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/libguile/whippet/src/tracer.h b/libguile/whippet/src/tracer.h
new file mode 100644
index 000000000..c563a7018
--- /dev/null
+++ b/libguile/whippet/src/tracer.h
@@ -0,0 +1,65 @@
+#ifndef TRACER_H
+#define TRACER_H
+
+#include "gc-ref.h"
+#include "gc-edge.h"
+#include "root.h"
+
+struct gc_heap;
+
+// Data types to be implemented by tracer.
+struct gc_tracer;
+struct gc_trace_worker;
+// Data types to be implemented by collector.
+struct gc_trace_worker_data;
+
+////////////////////////////////////////////////////////////////////////
+/// To be implemented by collector.
+////////////////////////////////////////////////////////////////////////
+
+// Visit all fields in an object.
+static inline void trace_one(struct gc_ref ref, struct gc_heap *heap,
+ struct gc_trace_worker *worker) GC_ALWAYS_INLINE;
+static inline void trace_root(struct gc_root root, struct gc_heap *heap,
+ struct gc_trace_worker *worker) GC_ALWAYS_INLINE;
+
+static void
+gc_trace_worker_call_with_data(void (*f)(struct gc_tracer *tracer,
+ struct gc_heap *heap,
+ struct gc_trace_worker *worker,
+ struct gc_trace_worker_data *data),
+ struct gc_tracer *tracer,
+ struct gc_heap *heap,
+ struct gc_trace_worker *worker);
+
+////////////////////////////////////////////////////////////////////////
+/// To be implemented by tracer.
+////////////////////////////////////////////////////////////////////////
+
+// Initialize the tracer when the heap is created.
+static int gc_tracer_init(struct gc_tracer *tracer, struct gc_heap *heap,
+ size_t parallelism);
+
+// Initialize the tracer for a new GC cycle.
+static void gc_tracer_prepare(struct gc_tracer *tracer);
+
+// Release any resources allocated during the trace.
+static void gc_tracer_release(struct gc_tracer *tracer);
+
+// Add root objects to the trace. Call before tracer_trace.
+static inline void gc_tracer_add_root(struct gc_tracer *tracer,
+ struct gc_root root);
+
+// Given that an object has been shaded grey, enqueue for tracing.
+static inline void gc_trace_worker_enqueue(struct gc_trace_worker *worker,
+ struct gc_ref ref) GC_ALWAYS_INLINE;
+static inline struct gc_trace_worker_data*
+gc_trace_worker_data(struct gc_trace_worker *worker) GC_ALWAYS_INLINE;
+
+// Just trace roots.
+static inline void gc_tracer_trace_roots(struct gc_tracer *tracer);
+
+// Run the full trace, including roots.
+static inline void gc_tracer_trace(struct gc_tracer *tracer);
+
+#endif // TRACER_H