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 "task.h"
26#include <cx/thread/rwlock.h>
29
30typedef struct TaskQueue TaskQueue;
31typedef struct TaskQueue_WeakRef TaskQueue_WeakRef;
32typedef struct TQWorker TQWorker;
33typedef struct TQWorker_WeakRef TQWorker_WeakRef;
34typedef struct ComplexTask ComplexTask;
35typedef struct ComplexTask_WeakRef ComplexTask_WeakRef;
36typedef struct ComplexTask ComplexTask;
37typedef struct ComplexTask_WeakRef ComplexTask_WeakRef;
38typedef struct TRGate TRGate;
39typedef struct TRGate_WeakRef TRGate_WeakRef;
40typedef struct ComplexTaskQueue ComplexTaskQueue;
41typedef struct ComplexTaskQueue_WeakRef ComplexTaskQueue_WeakRef;
42typedef struct TaskControl TaskControl;
43typedef struct ComplexTask ComplexTask;
44typedef struct ComplexTask_WeakRef ComplexTask_WeakRef;
46saDeclarePtr(ComplexTask_WeakRef);
47
52#define ctaskDependOn(task, dep) ctaskRequireTask(task, dep, false)
56#define ctaskWaitFor(task, dep) ctaskRequireTask(task, dep, true)
60#define ctaskDependOnTimeout(task, dep, timeout) ctaskRequireTaskTimeout(task, dep, false, timeout)
64#define ctaskWaitForTimeout(task, dep, timeout) ctaskRequireTaskTimeout(task, dep, true, timeout)
85
86typedef struct ComplexTask_ClassIf {
87 ObjIface* _implements;
88 ObjIface* _parent;
89 size_t _size;
90
91 uint32 (*run)(_In_ void* self, _In_ TaskQueue* tq, _In_ TQWorker* worker, _Inout_ TaskControl* tcon);
92 void (*runCancelled)(_In_ void* self, _In_ TaskQueue* tq, _In_ TQWorker* worker);
93 bool (*cancel)(_In_ void* self);
94 bool (*reset)(_In_ void* self);
95 bool (*wait)(_In_ void* self, int64 timeout);
96 intptr (*cmp)(_In_ void* self, void* other, uint32 flags);
97 uint32 (*hash)(_In_ void* self, uint32 flags);
98} ComplexTask_ClassIf;
99extern ComplexTask_ClassIf ComplexTask_ClassIf_tmpl;
100
102typedef struct ComplexTask {
103 union {
104 ComplexTask_ClassIf* _;
105 void* _is_ComplexTask;
106 void* _is_Task;
107 void* _is_BasicTask;
108 void* _is_ObjInst;
109 };
110 ObjClassInfo* _clsinfo;
111 atomic(uintptr) _ref;
112 atomic(ptr) _weakref;
113
114 atomic(uint32) state;
115 string name;
116 int64 last;
117 cchain oncomplete;
118 int64 nextrun;
120 Weak(ComplexTaskQueue)* lastq;
121 sa_TaskRequires _requires;
122 uint16 flags;
123 uint16 _intflags;
124 atomic(uint32) _advcount;
126extern ObjClassInfo ComplexTask_clsinfo;
127#define ComplexTask(inst) ((ComplexTask*)(unused_noeval((inst) && &((inst)->_is_ComplexTask)), (inst)))
128#define ComplexTaskNone ((ComplexTask*)NULL)
129
130typedef struct ComplexTask_WeakRef {
131 union {
132 ObjInst* _inst;
133 void* _is_ComplexTask_WeakRef;
134 void* _is_Task_WeakRef;
135 void* _is_BasicTask_WeakRef;
136 void* _is_ObjInst_WeakRef;
137 };
138 atomic(uintptr) _ref;
139 RWLock _lock;
140} ComplexTask_WeakRef;
141#define ComplexTask_WeakRef(inst) ((ComplexTask_WeakRef*)(unused_noeval((inst) && &((inst)->_is_ComplexTask_WeakRef)), (inst)))
142
143void ComplexTask_requireTask(_In_ ComplexTask* self, _In_ Task* dep, bool failok);
149#define ctaskRequireTask(self, dep, failok) ComplexTask_requireTask(ComplexTask(self), Task(dep), failok)
150
151void ComplexTask_requireTaskTimeout(_In_ ComplexTask* self, _In_ Task* dep, bool failok, int64 timeout);
158#define ctaskRequireTaskTimeout(self, dep, failok, timeout) ComplexTask_requireTaskTimeout(ComplexTask(self), Task(dep), failok, timeout)
159
160void ComplexTask_requireResource(_In_ ComplexTask* self, _In_ TaskResource* res);
165#define ctaskRequireResource(self, res) ComplexTask_requireResource(ComplexTask(self), TaskResource(res))
166
167void ComplexTask_requireResourceTimeout(_In_ ComplexTask* self, _In_ TaskResource* res, int64 timeout);
173#define ctaskRequireResourceTimeout(self, res, timeout) ComplexTask_requireResourceTimeout(ComplexTask(self), TaskResource(res), timeout)
174
175void ComplexTask_requireGate(_In_ ComplexTask* self, _In_ TRGate* gate);
180#define ctaskRequireGate(self, gate) ComplexTask_requireGate(ComplexTask(self), TRGate(gate))
181
182void ComplexTask_requireGateTimeout(_In_ ComplexTask* self, _In_ TRGate* gate, int64 timeout);
188#define ctaskRequireGateTimeout(self, gate, timeout) ComplexTask_requireGateTimeout(ComplexTask(self), TRGate(gate), timeout)
189
190void ComplexTask_require(_In_ ComplexTask* self, _In_ TaskRequires* req);
195#define ctaskRequire(self, req) ComplexTask_require(ComplexTask(self), TaskRequires(req))
196
197bool ComplexTask_advance(_In_ ComplexTask* self);
202#define ctaskAdvance(self) ComplexTask_advance(ComplexTask(self))
203
204uint32 ComplexTask_checkRequires(_In_ ComplexTask* self, bool updateProgress, _Out_opt_ int64* expires);
211#define ctaskCheckRequires(self, updateProgress, expires) ComplexTask_checkRequires(ComplexTask(self), updateProgress, expires)
212
213void ComplexTask_cancelRequires(_In_ ComplexTask* self);
217#define ctaskCancelRequires(self) ComplexTask_cancelRequires(ComplexTask(self))
218
219bool ComplexTask_acquireRequires(_In_ ComplexTask* self, sa_TaskRequires* acquired);
225#define ctaskAcquireRequires(self, acquired) ComplexTask_acquireRequires(ComplexTask(self), acquired)
226
227bool ComplexTask_releaseRequires(_In_ ComplexTask* self, sa_TaskRequires resources);
233#define ctaskReleaseRequires(self, resources) ComplexTask_releaseRequires(ComplexTask(self), resources)
234
235bool ComplexTask_advanceCallback(stvlist* cvars, stvlist* args);
242#define ctaskAdvanceCallback(cvars, args) ComplexTask_advanceCallback(cvars, args)
243
244// bool ctask_setState(ComplexTask* self, uint32 newstate);
245#define ctask_setState(self, newstate) BasicTask__setState(BasicTask(self), newstate)
246
258#define ctaskRun(self, tq, worker, tcon) (self)->_->run(ComplexTask(self), TaskQueue(tq), TQWorker(worker), tcon)
264#define ctaskRunCancelled(self, tq, worker) (self)->_->runCancelled(ComplexTask(self), TaskQueue(tq), TQWorker(worker))
265// bool ctaskCancel(ComplexTask* self);
266#define ctaskCancel(self) (self)->_->cancel(ComplexTask(self))
267// bool ctaskReset(ComplexTask* self);
268#define ctaskReset(self) (self)->_->reset(ComplexTask(self))
274#define ctaskWait(self, timeout) (self)->_->wait(ComplexTask(self), timeout)
275// intptr ctaskCmp(ComplexTask* self, ComplexTask* other, uint32 flags);
276#define ctaskCmp(self, other, flags) (self)->_->cmp(ComplexTask(self), other, flags)
277// uint32 ctaskHash(ComplexTask* self, uint32 flags);
278#define ctaskHash(self, flags) (self)->_->hash(ComplexTask(self), flags)
279
#define saDeclarePtr(name)
Definition sarray.h:98
ComplexTaskRunResultEnum
Return values from ComplexTask::run() extending BasicTaskRunResultEnum.
Definition complextask.h:66
ComplexTaskInternalFlagsEnum
Internal flags reserved for scheduler use.
Definition complextask.h:82
ComplexTaskFlagsEnum
Flags controlling ComplexTask behavior.
Definition complextask.h:74
@ TASK_Result_Schedule
Reschedule task to run after delay specified in TaskControl.delay.
Definition complextask.h:67
@ TASK_Result_Schedule_Progress
Same as Schedule, but marks progress (prevents stall warnings)
Definition complextask.h:68
@ TASK_Result_Defer
Defer task until manually advanced.
Definition complextask.h:69
@ TASK_Result_Defer_Progress
Same as Defer, but marks progress.
Definition complextask.h:70
@ TASK_INTERNAL_Owns_Resources
The task has acquired resources and needs to release them.
Definition complextask.h:83
@ TASK_Cancel_Expired
Cancel dependencies that exceed their timeout.
Definition complextask.h:78
@ TASK_Require_Failed
[Internal] Set when a soft requirement failed
Definition complextask.h:79
@ TASK_Soft_Requires
Allow task to run even if some dependencies fail.
Definition complextask.h:77
@ TASK_Cancel_Cascade
Cancel dependencies when this task is cancelled.
Definition complextask.h:75
@ TASK_Retain_Requires
Keep acquired resources across schedule/defer cycles.
Definition complextask.h:76
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
Current task state and flags.
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.
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:52
Task object with name, timing, and completion callbacks.
Abstract base class for task requirements.
Abstract base class for shared resources.