blob: e171a05f92d4115eb332719673ae5ae07d3923bf (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# 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`
|