23#define REDUCT_TASK_QUEUE_MAX 256
25#define REDUCT_TASK_SPIN_MAX 1000
38#define REDUCT_TASK_ID_INVALID ((reduct_task_id_t){ .index = UINT16_MAX, .generation = UINT16_MAX })
44typedef struct reduct_task
47 void (*func)(
struct reduct* reduct,
void* arg);
117 size_t head = atomic_load_explicit(&global->queueHead, memory_order_acquire);
118 size_t tail = atomic_load_explicit(&global->queueTail, memory_order_acquire);
#define REDUCT_ALWAYS_INLINE
Error handling and reporting.
REDUCT_API void reduct_task_global_init(reduct_task_global_t *global)
Initialize a global task state.
static REDUCT_ALWAYS_INLINE uint64_t reduct_task_queue_size(reduct_task_global_t *global)
Retrieve the number of pending tasks.
REDUCT_API bool reduct_task_create(struct reduct *reduct, void(*func)(struct reduct *reduct, void *arg), void *arg, reduct_task_id_t *outId)
Try to create a new task.
#define REDUCT_TASK_QUEUE_MAX
The maximum number of tasks.
REDUCT_API int reduct_task_worker(void *arg)
Worker thread main loop..
REDUCT_API void reduct_task_global_deinit(reduct_task_global_t *global)
Deinitialize a global task state.
REDUCT_API void reduct_task_join(struct reduct *reduct, reduct_task_id_t id)
Wait for a task to finish.
REDUCT_API void reduct_task_barrier(struct reduct *reduct)
Barrier function to ensure all threads have either reached the barrier.
Global thread-related state structure.
_Atomic(size_t) queueHead
_Atomic(size_t) queueTail
_Atomic(uint32_t) idleCount
_Atomic(uint32_t) barrierCount
_Atomic(uint32_t) barrierGen
uint16_t generation
Incrementally increasing counter to avoid ABA problems when reusing task slots in the queue.
uint16_t index
The index within the queue.
_Atomic(uint16_t) generation
Syncronization primitives.