CX Framework
Cross-platform C utility framework
Loading...
Searching...
No Matches
taskqueue.h
1#pragma once
2
4#include <cx/cx.h>
5#include <cx/log/log.h>
6#include <cx/taskqueue/queue/tqcomplex.h>
7#include <cx/taskqueue/queue/tqueue.h>
13#include <cx/taskqueue/worker/tqworker.h>
14
15CX_C_BEGIN
16
19
22
28void tqPresetSingle(_Out_ TaskQueueConfig* tqconfig);
29
36void tqPresetMinimal(_Out_ TaskQueueConfig* tqconfig);
37
44void tqPresetBalanced(_Out_ TaskQueueConfig* tqconfig);
45
51void tqPresetHeavy(_Out_ TaskQueueConfig* tqconfig);
52
59void tqPresetManual(_Out_ TaskQueueConfig* tqconfig);
60
66void tqEnableMonitor(_Inout_ TaskQueueConfig* tqconfig);
67
69
72
80_Ret_opt_valid_ _Check_return_ TaskQueue*
81tqCreate(_In_ strref name, _In_ const TaskQueueConfig* tqconfig);
82
89#define tqStart taskqueueStart
90
97#define tqTick taskqueueTick
98
106#define tqShutdown(tq, wait) taskqueueStop(tq, wait)
107
113#define tqRelease(ptq) objRelease(ptq)
114
116
119
127#define tqAdd(tq, task) taskqueueAdd(tq, task)
128
135#define tqRun(tq, ptask) \
136 do { \
137 taskqueueAdd(tq, *ptask); \
138 objRelease(ptask); \
139 } while (0)
140
141_meta_inline bool _tqSchedule(_Inout_ TaskQueue* tq, _In_ ComplexTask* task, int64 delay)
142{
143 ComplexTaskQueue* ctq = objDynCast(ComplexTaskQueue, tq);
144 if (!ctq)
145 return false;
146 return ctaskqueueSchedule(ctq, task, delay);
147}
156#define tqSchedule(tq, task, delay) _tqSchedule(tq, ComplexTask(task), delay)
157
158_meta_inline bool _tqDefer(_Inout_ TaskQueue* tq, _In_ ComplexTask* task)
159{
160 ComplexTaskQueue* ctq = objDynCast(ComplexTaskQueue, tq);
161 if (!ctq)
162 return false;
163 return ctaskqueueDefer(ctq, task);
164}
173#define tqDefer(tq, task) _tqDefer(tq, ComplexTask(task))
174
195bool tqCall(_Inout_ TaskQueue* tq, _In_ closure cls);
196
203int32 tqWorkers(_In_ TaskQueue* tq);
204
206
209
210_meta_inline uint32 _btaskState(BasicTask* bt)
211{
212 return atomicLoad(uint32, &bt->state, Acquire) & TASK_State_Mask;
213}
219#define btaskState(task) _btaskState(BasicTask(task))
225#define taskState(task) _btaskState(BasicTask(task))
226
227_meta_inline bool _btaskIsRunning(BasicTask* bt)
228{
229 return _btaskState(bt) == TASK_Running;
230}
236#define btaskIsRunning(task) _btaskIsRunning(BasicTask(task))
242#define taskIsRunning(task) _btaskIsRunning(BasicTask(task))
243
244_meta_inline bool _btaskIsPending(BasicTask* bt)
245{
246 uint32 state = _btaskState(bt);
247 return state == TASK_Waiting || state == TASK_Deferred || state == TASK_Scheduled;
248}
254#define btaskIsPending(task) _btaskIsPending(BasicTask(task))
260#define taskIsPending(task) _btaskIsPending(BasicTask(task))
261
262_meta_inline bool _btaskIsIdle(BasicTask* bt)
263{
264 uint32 state = _btaskState(bt);
265 return state == TASK_Created || state == TASK_Waiting || state == TASK_Deferred ||
266 state == TASK_Scheduled;
267}
273#define btaskIsIdle(task) _btaskIsIdle(BasicTask(task))
279#define taskIsIdle(task) _btaskIsIdle(BasicTask(task))
280
281_meta_inline bool _btaskIsComplete(BasicTask* bt)
282{
283 uint32 state = _btaskState(bt);
284 return state == TASK_Succeeded || state == TASK_Failed;
285}
291#define btaskIsComplete(task) _btaskIsComplete(BasicTask(task))
297#define taskIsComplete(task) _btaskIsComplete(BasicTask(task))
298
299_meta_inline bool _btaskSucceeded(BasicTask* bt)
300{
301 return _btaskState(bt) == TASK_Succeeded;
302}
308#define btaskSucceeded(task) _btaskSucceeded(BasicTask(task))
314#define taskSucceeded(task) _btaskSucceeded(BasicTask(task))
315
316_meta_inline bool _btaskFailed(BasicTask* bt)
317{
318 return _btaskState(bt) == TASK_Failed;
319}
325#define btaskFailed(task) _btaskFailed(BasicTask(task))
331#define taskFailed(task) _btaskFailed(BasicTask(task))
332
333_meta_inline bool _btaskCancelled(BasicTask* bt)
334{
335 return atomicLoad(uint32, &bt->state, Acquire) & TASK_Cancelled;
336}
343#define btaskCancelled(task) _btaskCancelled(BasicTask(task))
350#define taskCancelled(task) _btaskCancelled(BasicTask(task))
351
358#define taskCancel(task) btaskCancel(task)
359
366#define taskWait(task, timeout) ftaskWait(task, timeout)
367
370
371CX_C_END
Basic closure functionality.
#define objDynCast(clsname, inst)
Definition objclass.h:389
@ TASK_Deferred
Task is deferred, waiting for explicit advancement.
@ TASK_Created
Task has been created but not yet queued.
@ TASK_Running
Task is currently executing on a worker.
@ TASK_State_Mask
Mask to extract state value without flags.
@ TASK_Scheduled
Task is scheduled to run at a future time.
@ TASK_Cancelled
Flag indicating task has been cancelled (combines with state)
@ TASK_Failed
Task failed during execution.
@ TASK_Succeeded
Task completed successfully.
@ TASK_Waiting
Task is queued and waiting for a worker.
void tqPresetSingle(TaskQueueConfig *tqconfig)
void tqEnableMonitor(TaskQueueConfig *tqconfig)
void tqPresetHeavy(TaskQueueConfig *tqconfig)
void tqPresetMinimal(TaskQueueConfig *tqconfig)
void tqPresetBalanced(TaskQueueConfig *tqconfig)
void tqPresetManual(TaskQueueConfig *tqconfig)
TaskQueue * tqCreate(strref name, const TaskQueueConfig *tqconfig)
int32 tqWorkers(TaskQueue *tq)
bool tqCall(TaskQueue *tq, closure cls)
Core logging system API.
Multiphase task with internal state machine.
Bare minimum task object with state tracking and run method.
Definition basictask.h:69
Complex task with dependencies, scheduling, and resource management.
Complete configuration for a task queue.
Gate-based event synchronization for tasks.
FIFO-ordered task resource.
LIFO-ordered task resource.
Mutex-based task resource.