// // Created by red031000 on 2020-05-03. // #ifndef POKEDIAMOND_OS_THREAD_H #define POKEDIAMOND_OS_THREAD_H #include "types.h" #include "OS_context.h" typedef struct OSiAlarm OSAlarm; typedef struct _OSThread OSThread; typedef struct _OSThreadQueue OSThreadQueue; typedef struct _OSThreadLink OSThreadLink; typedef struct _OSMutexQueue OSMutexQueue; typedef struct _OSMutexLink OSMutexLink; typedef struct OSMutex OSMutex; struct _OSThreadQueue { OSThread *head; OSThread *tail; }; struct _OSThreadLink { OSThread *prev; OSThread *next; }; struct _OSMutexQueue { OSMutex *head; OSMutex *tail; }; struct _OSMutexLink { OSMutex *next; OSMutex *prev; }; typedef struct OSThreadInfo { u16 isNeedRescheduling; u16 irqDepth; OSThread* current; OSThread* list; void* switchCallback; // type: OSSwitchThreadCallback } OSThreadInfo; typedef enum { OS_THREAD_STATE_WAITING = 0, OS_THREAD_STATE_READY = 1, OS_THREAD_STATE_TERMINATED = 2 } OSThreadState; typedef void (*OSThreadDestructor) (void *); struct _OSThread { OSContext context; OSThreadState state; OSThread *next; u32 id; u32 priority; void *profiler; OSThreadQueue *queue; OSThreadLink link; OSMutex *mutex; OSMutexQueue mutexQueue; u32 stackTop; u32 stackBottom; u32 stackWarningOffset; OSThreadQueue joinQueue; void *specific[3]; OSAlarm *alarmForSleep; OSThreadDestructor destructor; void *userParameter; u32 systemErrno; }; extern OSThreadInfo OSi_ThreadInfo; void OS_SleepThread(OSThreadQueue * queue); void OS_WakeupThread(OSThreadQueue * queue); static inline void OS_InitThreadQueue(OSThreadQueue * queue) { queue->head = queue->tail = NULL; } #endif //POKEDIAMOND_OS_THREAD_H