#include <signal.h>
#include <proc.h>
+/**
+ * \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
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
Uint TID; //!< Thread ID
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
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_MUTEXSLEEP, // Mutex Sleep
+ THREAD_STAT_WAITING, // ??? (Waiting for a thread)
THREAD_STAT_PREINIT, // Being created
THREAD_STAT_ZOMBIE, // Died, just not removed
THREAD_STAT_DEAD // Why do we care about these???
#define GETMSG_IGNORE ((void*)-1)
+// === GLOBALS ===
+extern BOOL gaThreads_NoTaskSwitch[MAX_CPUS];
+
// === FUNCTIONS ===
extern tThread *Proc_GetCurThread(void);
extern tThread *Threads_GetThread(Uint TID);
-extern void Threads_SetTickets(tThread *Thread, int Num);
+extern void Threads_SetPriority(tThread *Thread, int Pri);
extern int Threads_Wake(tThread *Thread);
extern void Threads_AddActive(tThread *Thread);
extern tThread *Threads_GetNextToRun(int CPU, tThread *Last);