summaryrefslogtreecommitdiff
path: root/docs/application/gc.md
blob: 764285b34f4e81625ef0e43ebdae012a3d057752 (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
30
31
32
33
34
35
# Garbage Collection

---

## Object Definition

```c
typedef enum : uint16_t {
   LOCK_MUTEX = 1 << 0,
} kpl_gc_flags;

typedef struct _kpl_gc {
    POOL_HEADER(_kpl_gc);
    _Atomic bool mark;
    int16_t flags;
    kpl_any any;
    pthread_mutex_t mutex;
} kpl_gc;

static _Atomic int32_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. The async queue is moved to a temp queue and as each item on the tmep queue is marked it is moved back to the async queue
5. A sweep on the `gc_head_sweep` is done
6. What remains on the `gc_head_sweep` is added to `gc_head`