#pragma once #include "cpu_context.h" #include "mem.h" #define KTHREAD_NAME_MAX_LENGTH 32 #define KTHREAD_DEFAULT_STACK_SIZE PAGE_SIZE typedef enum { RUNNING, READY, SLEEPING, WAITING, EXITING } kthread_state; struct thread { char name[KTHREAD_NAME_MAX_LENGTH]; struct cpu_state *cpuState; kthread_state state; vaddr_t stackAddr; size_t stackSize; unsigned long jiffiesSleeping; int sleepHaveTimeouted; struct thread *next; struct thread *prev; struct thread*timeNext; struct thread *timePrev; }; int kthreadSetup(vaddr_t mainStack, size_t mainStackSize); void kthreadExit(); struct thread *kthreadCreate(const char *name, cpu_kstate_function_arg1_t func, void *args); void kthreadDelete(struct thread *thread); struct thread *kthreadSelectNext(); struct cpu_state *kthreadSwitch(struct cpu_state *prevCpu); int kthreadYield(); int kthreadWait(struct thread *current, struct thread *next, unsigned long msec); int kthreadUnsched(struct thread *th); int kthreadMsleep(unsigned long msec); int kthreadOnJieffiesTick(); struct thread *getCurrentThread(); int kthreadAddThread(struct thread *th);