X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Finclude%2Fthreads.h;h=f53bbad2f3525032dedd5f945ae9c902d2a56ecd;hb=refs%2Ftags%2Frel0.07;hp=2b066d9f338f917fdd2d4fdc813ea4bcbe9ad216;hpb=5beb98670f040b2d4e697e4d8690cd46d2d30cf3;p=tpg%2Facess2.git diff --git a/Kernel/include/threads.h b/Kernel/include/threads.h index 2b066d9f..f53bbad2 100644 --- a/Kernel/include/threads.h +++ b/Kernel/include/threads.h @@ -5,46 +5,55 @@ #include #include +#include +/** + * \brief IPC Message + */ typedef struct sMessage { - struct sMessage *Next; - Uint Source; - Uint Length; - Uint8 Data[]; -} tMsg; // sizeof = 12+ + struct sMessage *Next; //!< Next message in thread's inbox + tTID Source; //!< Source thread ID + Uint Length; //!< Length of message data in bytes + Uint8 Data[]; //!< Message data +} tMsg; +/** + * \brief Core threading structure + * + */ typedef struct sThread { // --- threads.c's - // 0 - struct sThread *Next; //!< Next thread in list - tSpinlock IsLocked; //!< Thread's spinlock + /** + * \brief Next thread in current list + * \note Required to be first for linked list hacks to work + */ + struct sThread *Next; + struct sThread *GlobalNext; //!< Next thread in global list + struct sThread *GlobalPrev; //!< Previous thread in global list + tShortSpinlock IsLocked; //!< Thread's spinlock volatile int Status; //!< Thread Status + void *WaitPointer; //!< What (Mutex/Thread/other) is the thread waiting on int RetStatus; //!< Return Status - // 16 Uint TID; //!< Thread ID Uint TGID; //!< Thread Group (Process) - Uint PTID; //!< Parent Thread ID + struct sThread *Parent; //!< Parent Thread Uint UID, GID; //!< User and Group char *ThreadName; //!< Name of thread // --- arch/proc.c's responsibility - // 40 //! Kernel Stack Base tVAddr KernelStack; - // 44 (x86) //! Memory Manager State tMemoryState MemState; - // 48 (x86) //! State on task switch tTaskState SavedState; // --- threads.c's - // 60 int CurFaultNum; //!< Current fault number, 0: none tVAddr FaultHandler; //!< Fault Handler @@ -52,19 +61,37 @@ typedef struct sThread tMsg *LastMessage; //!< Last Message (speeds up insertion) int Quantum, Remaining; //!< Quantum Size and remaining timesteps - int NumTickets; //!< Priority - Chance of gaining CPU + int Priority; //!< Priority - 0: Realtime, higher means less time Uint Config[NUM_CFG_ENTRIES]; //!< Per-process configuration + + volatile int CurCPU; } tThread; enum { - THREAD_STAT_NULL, - THREAD_STAT_ACTIVE, - THREAD_STAT_SLEEPING, - THREAD_STAT_WAITING, - THREAD_STAT_ZOMBIE, - THREAD_STAT_DEAD + THREAD_STAT_NULL, // Invalid process + THREAD_STAT_ACTIVE, // Running and schedulable process + THREAD_STAT_SLEEPING, // Message Sleep + THREAD_STAT_MUTEXSLEEP, // Mutex Sleep + THREAD_STAT_SEMAPHORESLEEP, // Semaphore Sleep + THREAD_STAT_WAITING, // ??? (Waiting for a thread) + THREAD_STAT_PREINIT, // Being created + THREAD_STAT_ZOMBIE, // Died/Killed, but parent not informed + THREAD_STAT_DEAD, // Awaiting burial (free) + THREAD_STAT_BURIED // If it's still on the list here, something's wrong +}; +static const char * const casTHREAD_STAT[] = { + "THREAD_STAT_NULL", + "THREAD_STAT_ACTIVE", + "THREAD_STAT_SLEEPING", + "THREAD_STAT_MUTEXSLEEP", + "THREAD_STAT_SEMAPHORESLEEP", + "THREAD_STAT_WAITING", + "THREAD_STAT_PREINIT", + "THREAD_STAT_ZOMBIE", + "THREAD_STAT_DEAD", + "THREAD_STAT_BURIED" }; enum eFaultNumbers @@ -77,10 +104,31 @@ enum eFaultNumbers FAULT_FLOAT }; +#define GETMSG_IGNORE ((void*)-1) + +// === GLOBALS === +extern BOOL gaThreads_NoTaskSwitch[MAX_CPUS]; + // === FUNCTIONS === -extern tThread *Proc_GetCurThread(); +extern tThread *Proc_GetCurThread(void); extern tThread *Threads_GetThread(Uint TID); -extern void Threads_Wake(tThread *Thread); +extern void Threads_SetPriority(tThread *Thread, int Pri); +extern int Threads_Wake(tThread *Thread); +extern void Threads_Kill(tThread *Thread, int Status); extern void Threads_AddActive(tThread *Thread); +extern tThread *Threads_RemActive(void); +extern tThread *Threads_GetNextToRun(int CPU, tThread *Last); + +extern void Threads_SetFaultHandler(Uint Handler); + +extern int Threads_SetUID(Uint *Errno, tUID ID); +extern int Threads_SetGID(Uint *Errno, tUID ID); +extern int Threads_WaitTID(int TID, int *Status); + +extern tThread *Threads_CloneTCB(Uint *Err, Uint Flags); +extern tThread *Threads_CloneThreadZero(void); + +extern int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data); +extern int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer); #endif