13 typedef struct sMessage
15 struct sMessage *Next; //!< Next message in thread's inbox
16 tTID Source; //!< Source thread ID
17 Uint Length; //!< Length of message data in bytes
18 Uint8 Data[]; //!< Message data
22 * \brief Core threading structure
25 typedef struct sThread
29 * \brief Next thread in current list
30 * \note Required to be first for linked list hacks to work
33 struct sThread *GlobalNext; //!< Next thread in global list
34 struct sThread *GlobalPrev; //!< Previous thread in global list
35 tShortSpinlock IsLocked; //!< Thread's spinlock
36 volatile int Status; //!< Thread Status
37 void *WaitPointer; //!< What (Mutex/Thread/other) is the thread waiting on
38 int RetStatus; //!< Return Status
40 Uint TID; //!< Thread ID
41 Uint TGID; //!< Thread Group (Process)
42 struct sThread *Parent; //!< Parent Thread
43 Uint UID, GID; //!< User and Group
44 char *ThreadName; //!< Name of thread
46 // --- arch/proc.c's responsibility
50 //! Memory Manager State
51 tMemoryState MemState;
53 //! State on task switch
54 tTaskState SavedState;
57 int CurFaultNum; //!< Current fault number, 0: none
58 tVAddr FaultHandler; //!< Fault Handler
60 tMsg * volatile Messages; //!< Message Queue
61 tMsg *LastMessage; //!< Last Message (speeds up insertion)
63 int Quantum, Remaining; //!< Quantum Size and remaining timesteps
64 int Priority; //!< Priority - 0: Realtime, higher means less time
66 Uint Config[NUM_CFG_ENTRIES]; //!< Per-process configuration
73 THREAD_STAT_NULL, // Invalid process
74 THREAD_STAT_ACTIVE, // Running and schedulable process
75 THREAD_STAT_SLEEPING, // Message Sleep
76 THREAD_STAT_MUTEXSLEEP, // Mutex Sleep
77 THREAD_STAT_SEMAPHORESLEEP, // Semaphore Sleep
78 THREAD_STAT_WAITING, // ??? (Waiting for a thread)
79 THREAD_STAT_PREINIT, // Being created
80 THREAD_STAT_ZOMBIE, // Died/Killed, but parent not informed
81 THREAD_STAT_DEAD, // Awaiting burial (free)
82 THREAD_STAT_BURIED // If it's still on the list here, something's wrong
84 static const char * const casTHREAD_STAT[] = {
87 "THREAD_STAT_SLEEPING",
88 "THREAD_STAT_MUTEXSLEEP",
89 "THREAD_STAT_SEMAPHORESLEEP",
90 "THREAD_STAT_WAITING",
91 "THREAD_STAT_PREINIT",
107 #define GETMSG_IGNORE ((void*)-1)
110 extern BOOL gaThreads_NoTaskSwitch[MAX_CPUS];
113 extern tThread *Proc_GetCurThread(void);
114 extern tThread *Threads_GetThread(Uint TID);
115 extern void Threads_SetPriority(tThread *Thread, int Pri);
116 extern int Threads_Wake(tThread *Thread);
117 extern void Threads_Kill(tThread *Thread, int Status);
118 extern void Threads_AddActive(tThread *Thread);
119 extern tThread *Threads_RemActive(void);
120 extern tThread *Threads_GetNextToRun(int CPU, tThread *Last);
122 extern void Threads_SetFaultHandler(Uint Handler);
124 extern int Threads_SetUID(Uint *Errno, tUID ID);
125 extern int Threads_SetGID(Uint *Errno, tUID ID);
126 extern int Threads_WaitTID(int TID, int *Status);
128 extern tThread *Threads_CloneTCB(Uint *Err, Uint Flags);
129 extern tThread *Threads_CloneThreadZero(void);
131 extern int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data);
132 extern int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer);