Buglocating: Some random corruption in VFS, FDD lockups
[tpg/acess2.git] / Kernel / include / threads.h
index 715be8c..833a3c7 100644 (file)
@@ -7,45 +7,53 @@
 #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
-       //  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
        
@@ -53,22 +61,23 @@ 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
        
-       // --- proc.c's
        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_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???
 };
 
 enum eFaultNumbers
@@ -83,10 +92,14 @@ enum eFaultNumbers
 
 #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_Wake(tThread *Thread);
+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);
 

UCC git Repository :: git.ucc.asn.au