mirror of
https://github.com/zeldaret/st
synced 2026-05-23 15:01:41 -04:00
c98c03de39
* match wstring.c * match math_api.c, mbstring.c, mem.c and mem_funcs.c * more progress * build issues * fix non-matching issues * reorganise files * match fdlibm (+ libc progress) * fix jp build * solved some non-matchings and progress * removed types.h usage in libc * match data and add missing delinks for jp
99 lines
2.5 KiB
C
99 lines
2.5 KiB
C
#ifndef NITROSDK_OS_THREAD_H
|
|
#define NITROSDK_OS_THREAD_H
|
|
|
|
#include <nitro/os/context.h>
|
|
|
|
/// MARK: Types
|
|
|
|
typedef struct OSThread OSThread;
|
|
typedef struct OSMutex OSMutex;
|
|
|
|
typedef void (*OSThreadSwitchCallback)(OSThread *oldThread, OSThread *newThread);
|
|
typedef void (*OSThreadDestructor)(void *);
|
|
|
|
typedef struct OSThreadLinkedList {
|
|
/* 0x04 */ OSThread *prev;
|
|
/* 0x00 */ OSThread *next;
|
|
} OSThreadLinkedList;
|
|
|
|
typedef struct OSMutexQueue {
|
|
/* 0x00 */ OSMutex *head;
|
|
/* 0x04 */ OSMutex *tail;
|
|
} OSMutexQueue;
|
|
|
|
typedef struct OSMutexLinkedList {
|
|
/* 0x00 */ OSMutex *next;
|
|
/* 0x04 */ OSMutex *prev;
|
|
} OSMutexLinkedList;
|
|
|
|
typedef struct OSThreadQueue {
|
|
/* 0x00 */ OSThread *head;
|
|
/* 0x04 */ OSThread *tail;
|
|
} OSThreadQueue;
|
|
|
|
typedef struct OSThreadInfo {
|
|
/* 0x00 */ u16 isSchedulerWaiting;
|
|
/* 0x02 */ u16 irqDepth;
|
|
/* 0x10 */ OSThread *current;
|
|
/* 0x14 */ OSThread *list;
|
|
/* 0x18 */ OSThreadSwitchCallback callback;
|
|
} OSThreadInfo;
|
|
|
|
typedef struct OSThread {
|
|
/* 0x00 */ OSContext context;
|
|
/* 0x64 */ s32 state;
|
|
/* 0x68 */ OSThread *next;
|
|
/* 0x6C */ u32 id;
|
|
/* 0x70 */ u32 priority;
|
|
/* 0x74 */ void *profiler;
|
|
/* 0x78 */ OSThreadQueue *queue;
|
|
/* 0x7C */ OSThreadLinkedList list;
|
|
/* 0x84 */ OSMutex *mutex;
|
|
/* 0x88 */ OSMutexQueue mutexQueue;
|
|
/* 0x90 */ u32 stackTop;
|
|
/* 0x94 */ u32 stackBottom;
|
|
/* 0x98 */ u32 stackOffset;
|
|
/* 0x9C */ OSThreadQueue joinQueue;
|
|
/* 0xA4 */ void *unk_A4[3];
|
|
/* 0xB0 */ void *unk_B0;
|
|
/* 0xB4 */ OSThreadDestructor destructor;
|
|
/* 0xB8 */ void *userParam;
|
|
/* 0xBC */ s32 error;
|
|
} OSThread; // Size: 0xC0
|
|
|
|
extern OSThreadInfo ThreadInfo;
|
|
|
|
/// MARK: Functions
|
|
|
|
void OS_PauseThread(OSThreadQueue *queue);
|
|
void OS_UnpauseThread(OSThreadQueue *queue);
|
|
OSMutex *OS_RemoveMutexFromQueue(OSMutexQueue *queue);
|
|
OSThread *OS_SelectThread(void);
|
|
void OS_CreateThread(OSThread *thread, void (*func)(void *), void *arg, void *stack, u32 stackSize, u32 priority);
|
|
void OS_ExitThread(void);
|
|
|
|
/// MARK: Inlines
|
|
|
|
static inline void OS_InitThreadQueue(OSThreadQueue *queue) {
|
|
queue->tail = NULL;
|
|
queue->head = NULL;
|
|
}
|
|
|
|
static inline OSThreadInfo *OS_GetThreadInfo(void) {
|
|
return &ThreadInfo;
|
|
}
|
|
|
|
static inline OSThread *OS_GetCurrentThread(void) {
|
|
return OS_GetThreadInfo()->current;
|
|
}
|
|
|
|
static inline void OS_SetCurrentThread(OSThread *thread) {
|
|
OS_GetThreadInfo()->current = thread;
|
|
}
|
|
|
|
static inline u32 OS_GetThreadId(OSThread *thread) {
|
|
return thread->id;
|
|
}
|
|
|
|
#endif // NITROSDK_OS_THREAD_H
|