CX Framework
Cross-platform C utility framework
Loading...
Searching...
No Matches
complextask.h
Go to the documentation of this file.
1
19
20#pragma once
21// This header file is auto-generated!
22// Do not make changes to this file or they will be overwritten.
23// clang-format off
24#include <cx/obj.h>
25#include <cx/struct.h>
26#include "task.h"
27#include <cx/thread/rwlock.h>
30
31CX_C_BEGIN
32
33typedef struct TaskQueue TaskQueue;
34typedef struct TaskQueue_WeakRef TaskQueue_WeakRef;
35typedef struct TQWorker TQWorker;
36typedef struct TQWorker_WeakRef TQWorker_WeakRef;
37typedef struct ComplexTask ComplexTask;
38typedef struct ComplexTask_WeakRef ComplexTask_WeakRef;
39typedef struct ComplexTask ComplexTask;
40typedef struct ComplexTask_WeakRef ComplexTask_WeakRef;
41typedef struct TRGate TRGate;
42typedef struct TRGate_WeakRef TRGate_WeakRef;
43typedef struct ComplexTaskQueue ComplexTaskQueue;
44typedef struct ComplexTaskQueue_WeakRef ComplexTaskQueue_WeakRef;
45typedef struct TaskControl TaskControl;
46typedef struct ComplexTask ComplexTask;
47typedef struct ComplexTask_WeakRef ComplexTask_WeakRef;
49saDeclarePtr(ComplexTask_WeakRef);
50#define _sti_ComplexTask _sti_object
51#define SType_ComplexTask ComplexTask*
52#define STStorageType_ComplexTask ComplexTask*
53#define STypeArg_ComplexTask(type, val) stgeneric(object, (ObjInst*)objInstCheckClass(ComplexTask, val))
54#define STypeArgPtr_ComplexTask(type, val) (stgeneric*)objInstCheckClassPtr(ComplexTask, val)
55#define STypeCheckedArg_ComplexTask(type, val) stType(type), stArg(type, val)
56#define STypeCheckedPtrArg_ComplexTask(type, val) stType(type), stArgPtr(type, val)
57
62#define ctaskDependOn(task, dep) ctaskRequireTask(task, dep, false)
66#define ctaskWaitFor(task, dep) ctaskRequireTask(task, dep, true)
70#define ctaskDependOnTimeout(task, dep, timeout) ctaskRequireTaskTimeout(task, dep, false, timeout)
74#define ctaskWaitForTimeout(task, dep, timeout) ctaskRequireTaskTimeout(task, dep, true, timeout)
95
96typedef struct ComplexTask_ClassIf {
97 ObjIface* _implements;
98 ObjIface* _parent;
99 size_t _size;
100
101 uint32 (*run)(_In_ void* self, _In_ TaskQueue* tq, _In_ TQWorker* worker, _Inout_ TaskControl* tcon);
102 void (*runCancelled)(_In_ void* self, _In_ TaskQueue* tq, _In_ TQWorker* worker);
103 bool (*cancel)(_In_ void* self);
104 bool (*reset)(_In_ void* self);
105 bool (*wait)(_In_ void* self, int64 timeout);
106 intptr (*cmp)(_In_ void* self, void* other, uint32 flags);
107 uint32 (*hash)(_In_ void* self, uint32 flags);
108} ComplexTask_ClassIf;
109extern ComplexTask_ClassIf ComplexTask_ClassIf_tmpl;
110
112typedef struct ComplexTask {
113 union {
114 ComplexTask_ClassIf* _;
115 void* _is_ComplexTask;
116 void* _is_Task;
117 void* _is_BasicTask;
118 void* _is_ObjInst;
119 };
120 ObjClassInfo* _clsinfo;
121 atomic(uintptr) _ref;
122 atomic(ptr) _weakref;
123
124 atomic(uint32) state;
128 void* logctx;
129 string name;
130 int64 last;
131 cchain oncomplete;
132 int64 nextrun;
134 Weak(ComplexTaskQueue)* lastq;
135 sa_TaskRequires _requires;
136 uint16 flags;
137 uint16 _intflags;
138 atomic(uint32) _advcount;
140extern ObjClassInfo ComplexTask_clsinfo;
141#define ComplexTask(inst) objInstCheckClass(ComplexTask, inst)
142#define ComplexTaskNone ((ComplexTask*)NULL)
143
144typedef struct ComplexTask_WeakRef {
145 union {
146 ObjInst* _inst;
147 void* _is_ComplexTask_WeakRef;
148 void* _is_Task_WeakRef;
149 void* _is_BasicTask_WeakRef;
150 void* _is_ObjInst_WeakRef;
151 };
152 atomic(uintptr) _ref;
153 RWLock _lock;
154} ComplexTask_WeakRef;
155#define ComplexTask_WeakRef(inst) objWeakRefCheckClass(ComplexTask, inst)
156
157void ComplexTask_requireTask(_In_ ComplexTask* self, _In_ Task* dep, bool failok);
163#define ctaskRequireTask(self, dep, failok) ComplexTask_requireTask(ComplexTask(self), Task(dep), failok)
164
165void ComplexTask_requireTaskTimeout(_In_ ComplexTask* self, _In_ Task* dep, bool failok, int64 timeout);
172#define ctaskRequireTaskTimeout(self, dep, failok, timeout) ComplexTask_requireTaskTimeout(ComplexTask(self), Task(dep), failok, timeout)
173
174void ComplexTask_requireResource(_In_ ComplexTask* self, _In_ TaskResource* res);
179#define ctaskRequireResource(self, res) ComplexTask_requireResource(ComplexTask(self), TaskResource(res))
180
181void ComplexTask_requireResourceTimeout(_In_ ComplexTask* self, _In_ TaskResource* res, int64 timeout);
187#define ctaskRequireResourceTimeout(self, res, timeout) ComplexTask_requireResourceTimeout(ComplexTask(self), TaskResource(res), timeout)
188
189void ComplexTask_requireGate(_In_ ComplexTask* self, _In_ TRGate* gate);
194#define ctaskRequireGate(self, gate) ComplexTask_requireGate(ComplexTask(self), TRGate(gate))
195
196void ComplexTask_requireGateTimeout(_In_ ComplexTask* self, _In_ TRGate* gate, int64 timeout);
202#define ctaskRequireGateTimeout(self, gate, timeout) ComplexTask_requireGateTimeout(ComplexTask(self), TRGate(gate), timeout)
203
204void ComplexTask_require(_In_ ComplexTask* self, _In_ TaskRequires* req);
209#define ctaskRequire(self, req) ComplexTask_require(ComplexTask(self), TaskRequires(req))
210
211bool ComplexTask_advance(_In_ ComplexTask* self);
216#define ctaskAdvance(self) ComplexTask_advance(ComplexTask(self))
217
218uint32 ComplexTask_checkRequires(_In_ ComplexTask* self, bool updateProgress, _Out_opt_ int64* expires);
225#define ctaskCheckRequires(self, updateProgress, expires) ComplexTask_checkRequires(ComplexTask(self), updateProgress, expires)
226
227void ComplexTask_cancelRequires(_In_ ComplexTask* self);
231#define ctaskCancelRequires(self) ComplexTask_cancelRequires(ComplexTask(self))
232
233bool ComplexTask_acquireRequires(_In_ ComplexTask* self, sa_TaskRequires* acquired);
239#define ctaskAcquireRequires(self, acquired) ComplexTask_acquireRequires(ComplexTask(self), acquired)
240
241bool ComplexTask_releaseRequires(_In_ ComplexTask* self, sa_TaskRequires resources);
247#define ctaskReleaseRequires(self, resources) ComplexTask_releaseRequires(ComplexTask(self), resources)
248
249bool ComplexTask_advanceCallback(stvlist* cvars, stvlist* args);
256#define ctaskAdvanceCallback(cvars, args) ComplexTask_advanceCallback(cvars, args)
257
258// bool ctask_setState(ComplexTask* self, uint32 newstate);
259#define ctask_setState(self, newstate) BasicTask__setState(BasicTask(self), newstate)
260
272#define ctaskRun(self, tq, worker, tcon) (self)->_->run(ComplexTask(self), TaskQueue(tq), TQWorker(worker), tcon)
278#define ctaskRunCancelled(self, tq, worker) (self)->_->runCancelled(ComplexTask(self), TaskQueue(tq), TQWorker(worker))
279// bool ctaskCancel(ComplexTask* self);
280#define ctaskCancel(self) (self)->_->cancel(ComplexTask(self))
281// bool ctaskReset(ComplexTask* self);
282#define ctaskReset(self) (self)->_->reset(ComplexTask(self))
288#define ctaskWait(self, timeout) (self)->_->wait(ComplexTask(self), timeout)
289// intptr ctaskCmp(ComplexTask* self, ComplexTask* other, uint32 flags);
290#define ctaskCmp(self, other, flags) (self)->_->cmp(ComplexTask(self), other, flags)
291// uint32 ctaskHash(ComplexTask* self, uint32 flags);
292#define ctaskHash(self, flags) (self)->_->hash(ComplexTask(self), flags)
293
294CX_C_END
#define saDeclarePtr(name)
Definition sarray.h:100
ComplexTaskRunResultEnum
Return values from ComplexTask::run() extending BasicTaskRunResultEnum.
Definition complextask.h:76
ComplexTaskInternalFlagsEnum
Internal flags reserved for scheduler use.
Definition complextask.h:92
ComplexTaskFlagsEnum
Flags controlling ComplexTask behavior.
Definition complextask.h:84
@ TASK_Result_Schedule
Reschedule task to run after delay specified in TaskControl.delay.
Definition complextask.h:77
@ TASK_Result_Schedule_Progress
Same as Schedule, but marks progress (prevents stall warnings)
Definition complextask.h:78
@ TASK_Result_Defer
Defer task until manually advanced.
Definition complextask.h:79
@ TASK_Result_Defer_Progress
Same as Defer, but marks progress.
Definition complextask.h:80
@ TASK_INTERNAL_Owns_Resources
The task has acquired resources and needs to release them.
Definition complextask.h:93
@ TASK_Cancel_Expired
Cancel dependencies that exceed their timeout.
Definition complextask.h:88
@ TASK_Require_Failed
[Internal] Set when a soft requirement failed
Definition complextask.h:89
@ TASK_Soft_Requires
Allow task to run even if some dependencies fail.
Definition complextask.h:87
@ TASK_Cancel_Cascade
Cancel dependencies when this task is cancelled.
Definition complextask.h:85
@ TASK_Retain_Requires
Keep acquired resources across schedule/defer cycles.
Definition complextask.h:86
CX Struct System - Introspectable, serializable POD structures in C.
CX Object System - Object-oriented programming in C.
Reader-writer lock synchronization primitive.
Complex task with dependencies, scheduling, and resource management.
cchain oncomplete
Functions called when task completes (success or failure)
atomic(uint32) state
string name
Task name shown in monitor output.
atomic(uint32) _advcount
Number of times task has been advanced.
sa_TaskRequires _requires
List of requirements (dependencies, resources, gates)
int64 lastprogress
Timestamp of last progress change.
int64 nextrun
Next scheduled run time.
Weak(ComplexTaskQueue) *lastq
Last queue this task ran on before being deferred.
uint16 flags
Task behavior flags (ComplexTaskFlagsEnum)
uint16 _intflags
Internal flags reserved for scheduler use.
void * logctx
int64 last
Last time this task was moved between queues and/or run.
One-time event gate for task synchronization.
Abstract base class for task requirements (dependencies, resources, gates).
Abstract base for shared resources with exclusive access.
Task with name, timing information, and completion callbacks.
Definition task.h:62
Task object with name, timing, and completion callbacks.
Abstract base class for task requirements.
Abstract base class for shared resources.