summaryrefslogtreecommitdiff
path: root/libguile/whippet/src/heap-sizer.h
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/whippet/src/heap-sizer.h')
-rw-r--r--libguile/whippet/src/heap-sizer.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/libguile/whippet/src/heap-sizer.h b/libguile/whippet/src/heap-sizer.h
new file mode 100644
index 000000000..46ef841c8
--- /dev/null
+++ b/libguile/whippet/src/heap-sizer.h
@@ -0,0 +1,74 @@
+#ifndef HEAP_SIZER_H
+#define HEAP_SIZER_H
+
+#include "gc-api.h"
+
+#include "gc-options-internal.h"
+#include "growable-heap-sizer.h"
+#include "adaptive-heap-sizer.h"
+
+struct gc_heap_sizer {
+ enum gc_heap_size_policy policy;
+ union {
+ struct gc_growable_heap_sizer* growable;
+ struct gc_adaptive_heap_sizer* adaptive;
+ };
+};
+
+static struct gc_heap_sizer
+gc_make_heap_sizer(struct gc_heap *heap,
+ const struct gc_common_options *options,
+ uint64_t (*get_allocation_counter_from_thread)(struct gc_heap*),
+ void (*set_heap_size_from_thread)(struct gc_heap*, size_t),
+ struct gc_background_thread *thread) {
+ struct gc_heap_sizer ret = { options->heap_size_policy, };
+ switch (options->heap_size_policy) {
+ case GC_HEAP_SIZE_FIXED:
+ break;
+
+ case GC_HEAP_SIZE_GROWABLE:
+ ret.growable =
+ gc_make_growable_heap_sizer(heap, options->heap_size_multiplier);
+ break;
+
+ case GC_HEAP_SIZE_ADAPTIVE:
+ ret.adaptive =
+ gc_make_adaptive_heap_sizer (heap, options->heap_expansiveness,
+ get_allocation_counter_from_thread,
+ set_heap_size_from_thread,
+ thread);
+ break;
+
+ default:
+ GC_CRASH();
+ }
+ return ret;
+}
+
+static void
+gc_heap_sizer_on_gc(struct gc_heap_sizer sizer, size_t heap_size,
+ size_t live_bytes, size_t pause_ns,
+ void (*set_heap_size)(struct gc_heap*, size_t)) {
+ switch (sizer.policy) {
+ case GC_HEAP_SIZE_FIXED:
+ break;
+
+ case GC_HEAP_SIZE_GROWABLE:
+ gc_growable_heap_sizer_on_gc(sizer.growable, heap_size, live_bytes,
+ pause_ns, set_heap_size);
+ break;
+
+ case GC_HEAP_SIZE_ADAPTIVE:
+ if (sizer.adaptive->background_task_id < 0)
+ gc_adaptive_heap_sizer_background_task(sizer.adaptive);
+ gc_adaptive_heap_sizer_on_gc(sizer.adaptive, live_bytes, pause_ns,
+ set_heap_size);
+ break;
+
+ default:
+ GC_CRASH();
+ }
+}
+
+
+#endif // HEAP_SIZER_H