/*---------------------------------------------------------------------------* Project: MP library File: MPTasks.h Copyright (C) Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. *---------------------------------------------------------------------------*/ #ifndef __MPTASKS_H__ #define __MPTASKS_H__ #include #include #ifdef __cplusplus extern "C" { #endif #define MP_TASKQ_INIT (1 << 0) #define MP_TASKQ_RUN (1 << 1) #define MP_TASKQ_STOPPING (1 << 2) #define MP_TASKQ_STOP (1 << 3) #define MP_TASKQ_DONE (1 << 4) #define MP_TASK_INIT (1 << 0) #define MP_TASK_READY (1 << 1) #define MP_TASK_RUN (1 << 2) #define MP_TASK_DONE (1 << 3) #define MP_WAIT_TASKQ_RUN MP_TASKQ_RUN #define MP_WAIT_TASKQ_STOP MP_TASKQ_STOP #define MP_WAIT_TASKQ_DONE MP_TASKQ_DONE typedef u32 MPTaskQID; typedef u32 MPTaskID; typedef enum { MPTASKQ_BAD_ID = 0, MPTASK_BAD_ID = 0 } MPpad; typedef struct { u32 state; u32 func_result; u32 coreid; OSTime runtime; } MPTaskInfo; typedef struct { u32 (*func_ptr)(void *data, u32 data_len); void* func_data; u32 func_data_len; u32 func_result; } MPTaskFunc; typedef struct { MPTaskID taskid; void* taskq; u32 state; MPTaskFunc func; u32 coreid; OSTime runtime; void* udata; } MPTask; typedef MPTask* MPTaskPtr; typedef struct { volatile u32 state; u32 num_task; u32 num_task_ready; u32 num_task_run; u32 num_task_done; } MPTaskQInfo; typedef struct { MPTaskQID tqid; volatile u32 state; u32 num_task; u32 num_task_ready; u32 num_task_run; u32 num_task_done[MAX_SYSTEM_CORES]; s32 next_index[MAX_SYSTEM_CORES]; s32 end_index[MAX_SYSTEM_CORES]; MPTaskPtr* queue; u32 queue_len; OSSpinLock spinlock; } MPTaskQ; typedef MPTaskQ* MPTaskQPtr; // // Task Queues // void MPInitTaskQ(MPTaskQ* tq, MPTaskPtr* qlist, u32 q_len); BOOL MPTermTaskQ(MPTaskQ* taskq); BOOL MPGetTaskQInfo(MPTaskQ* taskq, MPTaskQInfo *tqinfo); BOOL MPStartTaskQ(MPTaskQ* taskq); BOOL MPRunTasksFromTaskQ(MPTaskQ* taskq, int deque_granularity); BOOL MPStopTaskQ(MPTaskQ* taskq); BOOL MPWaitTaskQ(MPTaskQ* taskq, u32 wmask); BOOL MPWaitTaskQWithTimeout(MPTaskQ* taskq, u32 wmask, OSTimeNanoseconds timeout); BOOL MPEnqueTask(MPTaskQ* taskq, MPTask* task); MPTaskPtr MPDequeTask(MPTaskQ* taskq); u32 MPDequeTasks(MPTaskQ* taskq, MPTaskPtr* tasks, int max_tasks); BOOL MPResetTaskQ(MPTaskQ* taskq); BOOL MPPrintTaskQStats(MPTaskQ *taskq, int size); // // Tasks // void MPInitTask(MPTask* task, void* func, void* data, u32 data_len); BOOL MPTermTask(MPTask* task); BOOL MPGetTaskInfo(MPTask* task, MPTaskInfo* tinfo); BOOL MPRunTask(MPTask* task); void* MPGetTaskUserData(MPTask* task); void MPSetTaskUserData(MPTask* task, void* udata); #ifdef __cplusplus } #endif #endif // __MPTASKS_H__