86 lines
2.0 KiB
C
86 lines
2.0 KiB
C
|
|
#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
|