summaryrefslogtreecommitdiff
path: root/docs/application/shared.md
blob: 753bd82ac55440fc0b25b2f1dfb49d5c24d82999 (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
36
37
38
39
40
41
# Shared

---

## Object Definition

```c
typedef struct _kpl_shared {
    POOL_HEADER(_kpl_shared);
    _Atomic bool mutating;
    bool mark;
    kpl_class class;
    kpl_task *queue_head, queue_tail;
    pthread_spinlock_t lock;
} kpl_shared;

static _Atomic int32_t shared_threads;

static pthread_mutex_t shared_head_mutex;

static kpl_shared *shared_head_sweep, *shared_head;
```

## Tracing

1. Once triggered add a init task to the async queue
2. This task moves the `shared_head` to the `shared_head_sweep` and sets the `shared_wait` to off for each thread
3. Each thread will run down its queue queue marking found shared objects
3. Once all have run and `shared_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 `shared_head_sweep` is done
6. What remains on the `shared_head_sweep` is added to `shared_head`

## Mutating

1. Check if state of `mutating`
    1. If false, set to true and add the task to the `async_queue_head`
    2. Once complete lock `lock` and check the `queue_head`
    3. If empty set the state of `mutating` to false
    4. Else queue the next task
2. If the state of `mutating` is true add the task to `queue_tail`