1 #pragma once
2 #include <wiiu/types.h>
3 #include <wiiu/os/time.h>
4 #include <wiiu/os/spinlock.h>
5 
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
9 
10 typedef enum
11 {
12    MP_TASK_STATE_INITIALISED           = 1 << 0,
13    MP_TASK_STATE_READY                 = 1 << 1,
14    MP_TASK_STATE_RUNNING               = 1 << 2,
15    MP_TASK_STATE_FINISHED              = 1 << 3,
16 } MPTaskState;
17 
18 typedef enum
19 {
20    MP_TASK_QUEUE_STATE_INITIALISED     = 1 << 0,
21    MP_TASK_QUEUE_STATE_READY           = 1 << 1,
22    MP_TASK_QUEUE_STATE_STOPPING        = 1 << 2,
23    MP_TASK_QUEUE_STATE_STOPPED         = 1 << 3,
24    MP_TASK_QUEUE_STATE_FINISHED        = 1 << 4,
25 } MPTaskQueueState;
26 
27 typedef uint32_t (*MPTaskFunc)(uint32_t, uint32_t);
28 
29 #pragma pack(push, 1)
30 typedef struct
31 {
32    MPTaskState state;
33    uint32_t result;
34    uint32_t coreID;
35    OSTime duration;
36 } MPTaskInfo;
37 #pragma pack(pop)
38 
39 typedef struct MPTask MPTask;
40 typedef struct MPTaskQueue MPTaskQueue;
41 
42 #pragma pack(push, 1)
43 typedef struct MPTask
44 {
45    MPTask *self;
46    MPTaskQueue *queue;
47    MPTaskState state;
48    MPTaskFunc func;
49    uint32_t userArg1;
50    uint32_t userArg2;
51    uint32_t result;
52    uint32_t coreID;
53    OSTime duration;
54    void *userData;
55 }MPTask;
56 #pragma pack(pop)
57 
58 typedef struct
59 {
60    MPTaskQueueState state;
61    uint32_t tasks;
62    uint32_t tasksReady;
63    uint32_t tasksRunning;
64    uint32_t tasksFinished;
65 }MPTaskQueueInfo;
66 
67 typedef struct MPTaskQueue
68 {
69    MPTaskQueue *self;
70    MPTaskQueueState state;
71    uint32_t tasks;
72    uint32_t tasksReady;
73    uint32_t tasksRunning;
74    uint32_t __unknown0;
75    uint32_t tasksFinished;
76    uint32_t __unknown1;
77    uint32_t __unknown2;
78    uint32_t queueIndex;
79    uint32_t __unknown3;
80    uint32_t __unknown4;
81    uint32_t queueSize;
82    uint32_t __unknown5;
83    MPTask **queue;
84    uint32_t queueMaxSize;
85    OSSpinLock lock;
86 }MPTaskQueue;
87 
88 void MPInitTaskQ(MPTaskQueue *queue, MPTask **queueBuffer, uint32_t queueBufferLen);
89 BOOL MPTermTaskQ(MPTaskQueue *queue);
90 BOOL MPGetTaskQInfo(MPTaskQueue *queue, MPTaskQueueInfo *info);
91 BOOL MPStartTaskQ(MPTaskQueue *queue);
92 BOOL MPStopTaskQ(MPTaskQueue *queue);
93 BOOL MPResetTaskQ(MPTaskQueue *queue);
94 BOOL MPEnqueTask(MPTaskQueue *queue, MPTask *task);
95 MPTask *MPDequeTask(MPTaskQueue *queue);
96 uint32_t MPDequeTasks(MPTaskQueue *queue, MPTask **queueBuffer, uint32_t queueBufferLen);
97 BOOL MPWaitTaskQ(MPTaskQueue *queue, MPTaskQueueState mask);
98 BOOL MPWaitTaskQWithTimeout(MPTaskQueue *queue, MPTaskQueueState wmask, OSTime timeout);
99 BOOL MPPrintTaskQStats(MPTaskQueue *queue, uint32_t unk);
100 void MPInitTask(MPTask *task, MPTaskFunc func, uint32_t userArg1, uint32_t userArg2);
101 BOOL MPTermTask(MPTask *task);
102 BOOL MPGetTaskInfo(MPTask *task, MPTaskInfo *info);
103 void *MPGetTaskUserData(MPTask *task);
104 void MPSetTaskUserData(MPTask *task, void *userData);
105 BOOL MPRunTasksFromTaskQ(MPTaskQueue *queue, uint32_t count);
106 BOOL MPRunTask(MPTask *task);
107 
108 #ifdef __cplusplus
109 }
110 #endif
111