CX Framework
Cross-platform C utility framework
Loading...
Searching...
No Matches
taskqueue.h
1#pragma once
2
3#include <cx/cx.h>
4#include <cx/log/log.h>
5#include <cx/taskqueue/queue/tqcomplex.h>
6#include <cx/taskqueue/queue/tqueue.h>
12#include <cx/taskqueue/worker/tqworker.h>
13
16
19
25void tqPresetSingle(_Out_ TaskQueueConfig *tqconfig);
26
33void tqPresetMinimal(_Out_ TaskQueueConfig *tqconfig);
34
41void tqPresetBalanced(_Out_ TaskQueueConfig *tqconfig);
42
48void tqPresetHeavy(_Out_ TaskQueueConfig* tqconfig);
49
56void tqPresetManual(_Out_ TaskQueueConfig* tqconfig);
57
63void tqEnableMonitor(_Inout_ TaskQueueConfig *tqconfig);
64
66
69
70
78_Ret_opt_valid_ _Check_return_
79TaskQueue *tqCreate(_In_ strref name, _In_ TaskQueueConfig *tqconfig);
80
87#define tqStart taskqueueStart
88
95#define tqTick taskqueueTick
96
104#define tqShutdown(tq, wait) taskqueueStop(tq, wait)
105
111#define tqRelease(ptq) objRelease(ptq)
112
114
117
118
126#define tqAdd(tq, task) taskqueueAdd(tq, task)
127
134#define tqRun(tq, ptask) do { taskqueueAdd(tq, *ptask); objRelease(ptask); } while(0)
135
136_meta_inline bool _tqSchedule(_Inout_ TaskQueue* tq, _In_ ComplexTask* task, int64 delay)
137{
138 ComplexTaskQueue* ctq = objDynCast(ComplexTaskQueue, tq);
139 if (!ctq)
140 return false;
141 return ctaskqueueSchedule(ctq, task, delay);
142}
151#define tqSchedule(tq, task, delay) _tqSchedule(tq, ComplexTask(task), delay)
152
153_meta_inline bool _tqDefer(_Inout_ TaskQueue* tq, _In_ ComplexTask* task)
154{
155 ComplexTaskQueue* ctq = objDynCast(ComplexTaskQueue, tq);
156 if (!ctq)
157 return false;
158 return ctaskqueueDefer(ctq, task);
159}
168#define tqDefer(tq, task) _tqDefer(tq, ComplexTask(task))
169
175typedef bool (*UserTaskCB)(TaskQueue *tq, void *data);
176
185bool tqCall(_Inout_ TaskQueue *tq, _In_ UserTaskCB func, _In_opt_ void *userdata);
186
193int32 tqWorkers(_In_ TaskQueue *tq);
194
196
199
200
201_meta_inline uint32 _btaskState(BasicTask *bt)
202{
203 return atomicLoad(uint32, &bt->state, Acquire) & TASK_State_Mask;
204}
210#define btaskState(task) _btaskState(BasicTask(task))
216#define taskState(task) _btaskState(BasicTask(task))
217
218_meta_inline bool _btaskIsRunning(BasicTask *bt)
219{
220 return _btaskState(bt) == TASK_Running;
221}
227#define btaskIsRunning(task) _btaskIsRunning(BasicTask(task))
233#define taskIsRunning(task) _btaskIsRunning(BasicTask(task))
234
235_meta_inline bool _btaskIsPending(BasicTask *bt)
236{
237 uint32 state = _btaskState(bt);
238 return state == TASK_Waiting || state == TASK_Deferred || state == TASK_Scheduled;
239}
245#define btaskIsPending(task) _btaskIsPending(BasicTask(task))
251#define taskIsPending(task) _btaskIsPending(BasicTask(task))
252
253_meta_inline bool _btaskIsIdle(BasicTask *bt)
254{
255 uint32 state = _btaskState(bt);
256 return state == TASK_Created || state == TASK_Waiting || state == TASK_Deferred ||
257 state == TASK_Scheduled;
258}
264#define btaskIsIdle(task) _btaskIsIdle(BasicTask(task))
270#define taskIsIdle(task) _btaskIsIdle(BasicTask(task))
271
272_meta_inline bool _btaskIsComplete(BasicTask* bt)
273{
274 uint32 state = _btaskState(bt);
275 return state == TASK_Succeeded || state == TASK_Failed;
276}
282#define btaskIsComplete(task) _btaskIsComplete(BasicTask(task))
288#define taskIsComplete(task) _btaskIsComplete(BasicTask(task))
289
290_meta_inline bool _btaskSucceeded(BasicTask *bt)
291{
292 return _btaskState(bt) == TASK_Succeeded;
293}
299#define btaskSucceeded(task) _btaskSucceeded(BasicTask(task))
305#define taskSucceeded(task) _btaskSucceeded(BasicTask(task))
306
307_meta_inline bool _btaskFailed(BasicTask *bt)
308{
309 return _btaskState(bt) == TASK_Failed;
310}
316#define btaskFailed(task) _btaskFailed(BasicTask(task))
322#define taskFailed(task) _btaskFailed(BasicTask(task))
323
324_meta_inline bool _btaskCancelled(BasicTask *bt)
325{
326 return atomicLoad(uint32, &bt->state, Acquire) & TASK_Cancelled;
327}
334#define btaskCancelled(task) _btaskCancelled(BasicTask(task))
341#define taskCancelled(task) _btaskCancelled(BasicTask(task))
342
349#define taskCancel(task) btaskCancel(task)
350
357#define taskWait(task, timeout) ftaskWait(task, timeout)
358
361
#define objDynCast(clsname, inst)
Definition objclass.h:350
@ 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, TaskQueueConfig *tqconfig)
bool tqCall(TaskQueue *tq, UserTaskCB func, void *userdata)
bool(* UserTaskCB)(TaskQueue *tq, void *data)
Definition taskqueue.h:175
int32 tqWorkers(TaskQueue *tq)
Core logging system API.
Multiphase task with internal state machine.
Bare minimum task object with state tracking and run method.
Definition basictask.h:59
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.