Initial (bad) gc
This commit is contained in:
62
src/gc.h
62
src/gc.h
@ -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
|
||||
|
||||
Reference in New Issue
Block a user