diff options
Diffstat (limited to 'libguile/whippet/src/growable-heap-sizer.h')
-rw-r--r-- | libguile/whippet/src/growable-heap-sizer.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/libguile/whippet/src/growable-heap-sizer.h b/libguile/whippet/src/growable-heap-sizer.h new file mode 100644 index 000000000..49e5ad377 --- /dev/null +++ b/libguile/whippet/src/growable-heap-sizer.h @@ -0,0 +1,59 @@ +#ifndef GROWABLE_HEAP_SIZER_H +#define GROWABLE_HEAP_SIZER_H + +#include <pthread.h> +#include <stdlib.h> +#include <string.h> + +#include "assert.h" +#include "heap-sizer.h" + +// This is a simple heap-sizing algorithm that will grow the heap if it is +// smaller than a given multiplier of the live data size. It does not shrink +// the heap. + +struct gc_growable_heap_sizer { + struct gc_heap *heap; + double multiplier; + pthread_mutex_t lock; +}; + +static void +gc_growable_heap_sizer_set_multiplier(struct gc_growable_heap_sizer *sizer, + double multiplier) { + pthread_mutex_lock(&sizer->lock); + sizer->multiplier = multiplier; + pthread_mutex_unlock(&sizer->lock); +} + +static void +gc_growable_heap_sizer_on_gc(struct gc_growable_heap_sizer *sizer, + size_t heap_size, size_t live_bytes, + uint64_t pause_ns, + void (*set_heap_size)(struct gc_heap*, size_t)) { + pthread_mutex_lock(&sizer->lock); + size_t target_size = live_bytes * sizer->multiplier; + if (target_size > heap_size) + set_heap_size(sizer->heap, target_size); + pthread_mutex_unlock(&sizer->lock); +} + +static struct gc_growable_heap_sizer* +gc_make_growable_heap_sizer(struct gc_heap *heap, double multiplier) { + struct gc_growable_heap_sizer *sizer; + sizer = malloc(sizeof(*sizer)); + if (!sizer) + GC_CRASH(); + memset(sizer, 0, sizeof(*sizer)); + sizer->heap = heap; + sizer->multiplier = multiplier; + pthread_mutex_init(&sizer->lock, NULL); + return sizer; +} + +static void +gc_destroy_growable_heap_sizer(struct gc_growable_heap_sizer *sizer) { + free(sizer); +} + +#endif // GROWABLE_HEAP_SIZER_H |