Files
st/include/nitro/os/thread.h
T
Yanis c98c03de39 Match MSL_C (#8)
* 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
2025-12-17 14:08:53 +01:00

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