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