Initial (bad) gc

This commit is contained in:
2026-01-21 20:52:18 -08:00
parent 4c04e71078
commit 656846ddc0
16 changed files with 650 additions and 79 deletions

View File

@ -1,23 +1,67 @@
#ifndef INCLUDED_GC_H
#define INCLUDED_GC_H
#include <stddef.h>
#include "memory.h"
typedef struct GCEntry {
void *obj;
struct GCEntry *prev;
struct GCEntry *next;
} GCEntry;
#include <stddef.h>
#include <stdio.h>
#include <threads.h>
extern bool lisp_doing_gc;
extern struct timespec total_gc_time;
extern size_t total_gc_count;
typedef struct {
size_t total_objects_searched;
size_t total_objects_cleaned;
struct timespec ellapsed_time;
} LispGCStats;
typedef struct {
unsigned int mark : 1;
unsigned int has_local_ref : 1;
GCEntry *entry;
tss_t has_local_ref;
} ObjectGCInfo;
void lisp_init_gc(void);
// the argument is a LispVal *
void lisp_gc_register_object(void *obj);
void lisp_gc_register_static_object(void *obj);
size_t lisp_gc_now(void);
// note that the argument is restrict!
void lisp_gc_now(LispGCStats *restrict status);
#define OBJECT_PROCESS_STACK_BLOCK_SIZE 64
struct ObjectProcessStackBlock {
void *objs[OBJECT_PROCESS_STACK_BLOCK_SIZE];
};
typedef struct {
size_t num_blocks;
size_t num_objs;
struct ObjectProcessStackBlock **blocks;
} ObjectProcessStack;
static ALWAYS_INLINE bool
OBJECT_PROCESS_STACK_EMPTY_P(ObjectProcessStack *restrict stack) {
return !stack->num_objs;
}
static ALWAYS_INLINE void
init_object_process_stack(ObjectProcessStack *restrict stack) {
stack->num_blocks = 0;
stack->num_objs = 0;
stack->blocks = NULL;
}
void free_object_process_stack(ObjectProcessStack *restrict stack);
void object_process_stack_push_held_objects(ObjectProcessStack *restrict stack,
void *obj);
void *object_process_stack_pop(ObjectProcessStack *restrict stack);
void gc_recursively_mark_object(void *obj);
// Debug
void debug_print_gc_stats(FILE *stream, const LispGCStats *stats);
#endif