X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Finclude%2Fthreads.h;h=20d21f4fbe0e555fbd5d1fee2cc2ee71d1cc3d05;hb=3e11c7767641614fbb3fad38fffefa0da9e66919;hp=644d0333ac1e7a42419ec80bf534b63c2bbb17c1;hpb=f119d0e5b18b7286d04fc536a94e0f96e3c51714;p=tpg%2Facess2.git diff --git a/Kernel/include/threads.h b/Kernel/include/threads.h index 644d0333..20d21f4f 100644 --- a/Kernel/include/threads.h +++ b/Kernel/include/threads.h @@ -5,29 +5,46 @@ #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 { - struct sThread *Next; //!< Next thread in list - int IsLocked; //!< Thread's spinlock - int Status; //!< Thread Status + // --- threads.c's + /** + * \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 int RetStatus; //!< Return Status 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 - tVAddr KernelStack; //!< Kernel Stack Base + // --- arch/proc.c's responsibility + //! Kernel Stack Base + tVAddr KernelStack; //! Memory Manager State tMemoryState MemState; @@ -35,32 +52,54 @@ typedef struct sThread //! State on task switch tTaskState SavedState; - int CurSignal; //!< Signal currently being handled (0 for none) - tVAddr SignalHandlers[NSIG]; //!< Signal Handler List - tTaskState SignalState; //!< Saved state for signal handler + // --- threads.c's + int CurFaultNum; //!< Current fault number, 0: none + tVAddr FaultHandler; //!< Fault Handler - tMsg *Messages; //!< Message Queue + tMsg * volatile Messages; //!< Message Queue tMsg *LastMessage; //!< Last Message (speeds up insertion) int Quantum, Remaining; //!< Quantum Size and remaining timesteps int NumTickets; //!< Priority - Chance of gaining CPU 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_OFFSLEEP, // Mutex Sleep (or waiting on a thread) + THREAD_STAT_WAITING, // ??? + THREAD_STAT_PREINIT, // Being created + THREAD_STAT_ZOMBIE, // Died, just not removed + THREAD_STAT_DEAD // Why do we care about these??? +}; + +enum eFaultNumbers +{ + FAULT_MISC, + FAULT_PAGE, + FAULT_ACCESS, + FAULT_DIV0, + FAULT_OPCODE, + 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_SetTickets(tThread *Thread, int Num); +extern int Threads_Wake(tThread *Thread); +extern void Threads_AddActive(tThread *Thread); +extern tThread *Threads_GetNextToRun(int CPU, tThread *Last); #endif