mirror of https://github.com/zeldaret/tp.git
116 lines
3.0 KiB
C
116 lines
3.0 KiB
C
#ifndef OSTHREAD_H
|
|
#define OSTHREAD_H
|
|
|
|
#include "dolphin/os/OSContext.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef u16 OSThreadState;
|
|
typedef s32 OSPriority; // 0 highest, 31 lowest
|
|
|
|
#define OS_THREAD_STATE_UNINITIALIZED 0
|
|
#define OS_THREAD_STATE_READY 1
|
|
#define OS_THREAD_STATE_RUNNING 2
|
|
#define OS_THREAD_STATE_WAITING 4
|
|
#define OS_THREAD_STATE_DEAD 8
|
|
|
|
#define OS_THREAD_ATTR_DETACH 0x0001u
|
|
|
|
#define OS_THREAD_STACK_MAGIC 0xDEADBABE
|
|
|
|
#define OS_PRIORITY_MIN 0 // highest
|
|
#define OS_PRIORITY_MAX 31 // lowest
|
|
#define OS_PRIORITY_IDLE OS_PRIORITY_MAX
|
|
|
|
typedef struct OSThread OSThread;
|
|
typedef struct OSThreadQueue OSThreadQueue;
|
|
typedef struct OSThreadLink OSThreadLink;
|
|
|
|
typedef struct OSMutex OSMutex;
|
|
typedef struct OSMutexQueue OSMutexQueue;
|
|
typedef struct OSMutexLink OSMutexLink;
|
|
typedef struct OSCond OSCond;
|
|
|
|
struct OSThreadLink {
|
|
OSThread* next;
|
|
OSThread* prev;
|
|
};
|
|
|
|
struct OSThreadQueue {
|
|
/* 0x0 */ OSThread* head;
|
|
/* 0x4 */ OSThread* tail;
|
|
};
|
|
|
|
struct OSMutexLink {
|
|
OSMutex* next;
|
|
OSMutex* prev;
|
|
};
|
|
|
|
struct OSMutexQueue {
|
|
OSMutex* head;
|
|
OSMutex* tail;
|
|
};
|
|
|
|
struct OSThread {
|
|
OSContext context;
|
|
OSThreadState state;
|
|
u16 attributes;
|
|
s32 suspend_count;
|
|
s32 effective_priority;
|
|
u32 base_priority;
|
|
void* exit_value;
|
|
OSThreadQueue* queue;
|
|
OSThreadLink link;
|
|
OSThreadQueue join_queue;
|
|
OSMutex* mutex;
|
|
OSMutexQueue owned_mutexes;
|
|
OSThreadLink active_threads_link;
|
|
u8* stack_base;
|
|
u32* stack_end;
|
|
u8* error_code;
|
|
void* data[2];
|
|
};
|
|
|
|
typedef void (*OSSwitchThreadCallback)(OSThread* from, OSThread* to);
|
|
|
|
OSThreadQueue OS_THREAD_QUEUE AT_ADDRESS(0x800000DC);
|
|
OSThread* OS_CURRENT_THREAD AT_ADDRESS(0x800000E4);
|
|
|
|
static void DefaultSwitchThreadCallback(OSThread* from, OSThread* to);
|
|
OSSwitchThreadCallback OSSetSwitchThreadCallback(OSSwitchThreadCallback func);
|
|
void __OSThreadInit(void);
|
|
void OSInitThreadQueue(OSThreadQueue* queue);
|
|
OSThread* OSGetCurrentThread(void);
|
|
BOOL OSIsThreadTerminated(OSThread* thread);
|
|
s32 OSDisableScheduler(void);
|
|
s32 OSEnableScheduler(void);
|
|
static void UnsetRun(OSThread* thread);
|
|
s32 __OSGetEffectivePriority(OSThread* thread);
|
|
static OSThread* SetEffectivePriority(OSThread* thread, s32 priority);
|
|
void __OSPromoteThread(OSThread* thread, s32 priority);
|
|
static OSThread* SelectThread(BOOL yield);
|
|
void __OSReschedule(void);
|
|
void OSYieldThread(void);
|
|
BOOL OSCreateThread(OSThread* thread, void* func, void* param, void* stackBase, u32 stackSize,
|
|
s32 priority, u16 attribute);
|
|
void OSExitThread(void* exitValue);
|
|
void OSCancelThread(OSThread* thread);
|
|
void OSDetachThread(OSThread* thread);
|
|
s32 OSResumeThread(OSThread* thread);
|
|
s32 OSSuspendThread(OSThread* thread);
|
|
void OSSleepThread(OSThreadQueue* queue);
|
|
void OSWakeupThread(OSThreadQueue* queue);
|
|
s32 OSSetThreadPriority(OSThread* thread, s32 priority);
|
|
s32 OSGetThreadPriority(OSThread* thread);
|
|
static s32 CheckThreadQueue(OSThreadQueue* thread);
|
|
s32 OSCheckActiveThreads(void);
|
|
static void OSClearStack(u8 value);
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
|
|
#endif /* OSTHREAD_H */
|