From 20a19f433956f063d8048f032aaf5dcce1d61e7c Mon Sep 17 00:00:00 2001 From: nodist Date: Thu, 11 Jun 2026 12:08:10 -0400 Subject: add algo for mutating shared object --- docs/application/shared.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 docs/application/shared.md (limited to 'docs/application/shared.md') diff --git a/docs/application/shared.md b/docs/application/shared.md new file mode 100644 index 0000000..753bd82 --- /dev/null +++ b/docs/application/shared.md @@ -0,0 +1,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` -- cgit v1.2.3