#ifndef RAVA_GC_H #define RAVA_GC_H #include #include #include #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