86 lines
2.0 KiB
C
Raw Normal View History

2025-12-05 01:12:39 +01:00
#ifndef RAVA_GC_H
#define RAVA_GC_H
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#define RAVA_GC_BLOCK_SIZE (32 * 1024)
#define RAVA_GC_LINE_SIZE 128
#define RAVA_GC_LINES_PER_BLOCK (RAVA_GC_BLOCK_SIZE / RAVA_GC_LINE_SIZE)
#define RAVA_GC_GRAY_STACK_SIZE 4096
#define RAVA_GC_INITIAL_THRESHOLD (1024 * 1024)
#define RAVA_ALIGN(size, align) (((size) + (align) - 1) & ~((align) - 1))
struct RavaGCHeader;
typedef struct RavaGCHeader RavaGCHeader_t;
typedef struct RavaGCBlock {
uint8_t line_marks[RAVA_GC_LINES_PER_BLOCK];
uint8_t flags;
uint16_t free_lines;
struct RavaGCBlock *next;
struct RavaGCBlock *prev;
uint8_t data[RAVA_GC_BLOCK_SIZE];
} RavaGCBlock_t;
#define RAVA_GC_BLOCK_FLAG_EVACUATE 0x01
#define RAVA_GC_BLOCK_FLAG_FULL 0x02
typedef struct RavaGCHeap {
RavaGCBlock_t *all_blocks;
RavaGCBlock_t *current_block;
uint8_t *bump_ptr;
uint8_t *block_limit;
RavaGCBlock_t *free_blocks;
RavaGCBlock_t *recyclable_blocks;
size_t total_allocated;
size_t live_bytes;
size_t gc_threshold;
RavaGCHeader_t *all_objects;
} RavaGCHeap_t;
typedef struct RavaGCStats {
size_t total_collections;
size_t objects_allocated;
size_t objects_freed;
size_t bytes_allocated;
size_t bytes_freed;
size_t current_live_objects;
size_t current_live_bytes;
size_t peak_live_bytes;
} RavaGCStats_t;
typedef struct RavaGCState {
RavaGCHeader_t *gray_stack[RAVA_GC_GRAY_STACK_SIZE];
size_t gray_count;
bool gc_active;
bool gc_enabled;
size_t objects_marked;
size_t bytes_marked;
} RavaGCState_t;
void rava_gc_init(void);
void rava_gc_shutdown(void);
void* rava_gc_alloc(size_t size, uint8_t type);
void rava_gc_free(void *ptr);
void rava_gc_collect(void);
void rava_gc_collect_if_needed(void);
void rava_gc_enable(void);
void rava_gc_disable(void);
bool rava_gc_is_enabled(void);
void rava_gc_pin(void *ptr);
void rava_gc_unpin(void *ptr);
RavaGCStats_t rava_gc_get_stats(void);
void rava_gc_print_stats(void);
#endif