#pragma once // Kpl threads, allocators, atomic queues and garbage collection #include "kpl/macro.h" typedef struct { int32_t count; } kpl_config_thread; typedef struct _kpl_task kpl_task; typedef struct _kpl_env kpl_env; typedef void kpl_task_fn(kpl_task *task, kpl_env *env); typedef struct _kpl_task { struct _kpl_task *_Atomic next, *join; // TODO kpl_result result; int32_t thread_id; _Atomic bool join_ready; } kpl_task; typedef struct { kpl_task *_Atomic head, *_Atomic tail; struct { kpl_task *_Atomic next; } dummy; } kpl_task_queue; typedef struct { kpl_task_queue task_queue; _Atomic ssize_t priority; // TODO sem_t spin_counter; pthread_t thread; } kpl_thread; typedef struct { _Atomic ssize_t total_priority; kpl_thread *threads; } kpl_process;