# Garbage Collection --- ## Object Definition ```c typedef struct _kpl_gc { POOL_HEADER(_kpl_gc); _Atomic bool mark; kpl_any any; pthread_mutex_t mutex; } kpl_gc; static _Atomic size_t gc_threads; static pthread_mutex_t gc_head_mutex; static kpl_gc *gc_head_sweep, *gc_head; ``` ## Tracing 1. Once triggered add a init task to the async queue 2. This task moves the `gc_head` to the `gc_head_sweep` and sets the `gc_wait` to off for each thread 3. Each thread will run down its queue queue marking found gc objects 3. Once all have run and `gc_threads == available_threads` add a mark and sweep task to the async queue 4. Async task goes down async queue and does final mark, then a sweep on the `gc_head_sweep` is done 5. What remains on the `gc_head_sweep` is added to `gc_head`