Kernel/threads - Debug cleanups and (hopefully) race avoidance
[tpg/acess2.git] / KernelLand / Kernel / include / threads_int.h
index 66bb8c1..1c9a08d 100644 (file)
@@ -1,5 +1,9 @@
 /*
- * Internal Threading header
+ * Acess2 Kernel
+ * - By John Hodge (thePowersGang)
+ *
+ * include/threads_int.h
+ * - Internal Threading header
  * - Only for use by stuff that needs access to the thread type.
  */
 #ifndef _THREADS_INT_H_
@@ -7,7 +11,8 @@
 
 #include <threads.h>
 #include <proc.h>
-
+#include <timers_int.h>
+#include <posix_signals.h>
 
 typedef struct sProcess        tProcess;
 
@@ -27,8 +32,13 @@ typedef struct sMessage
  */
 struct sProcess
 {
+       struct sProcess *Next;
+       struct sProcess *Prev;
+       tPGID   PGID;
        tPID    PID;
+
         int    nThreads;
+       struct sThread  *FirstThread;
        
        tUID    UID;    //!< User ID
        tGID    GID;    //!< User and Group
@@ -37,6 +47,8 @@ struct sProcess
         int    MaxFD;
        char    *CurrentWorkingDir;
        char    *RootDir;
+       
+       void    *SignalHandlers[NSIGNALS];
 };
 
 /**
@@ -53,6 +65,7 @@ struct sThread
        struct sThread  *Next;
        struct sThread  *GlobalNext;    //!< Next thread in global list
        struct sThread  *GlobalPrev;    //!< Previous thread in global list
+       struct sThread  *ProcessNext;
        tShortSpinlock  IsLocked;       //!< Thread's spinlock
        volatile int    Status;         //!< Thread Status
        void    *WaitPointer;   //!< What (Mutex/Thread/other) is the thread waiting on
@@ -62,7 +75,10 @@ struct sThread
        struct sProcess *Process;       //!< Thread Group / Process
        struct sThread  *Parent;        //!< Parent Thread
        char    *ThreadName;    //!< Name of thread
-       
+
+       struct sThread  *LastDeadChild; //!< Last child to die (will have the \a DeadChildren lock)
+       tMutex  DeadChildLock;  //!< Lock to prevent clobbering of \a LastDeadChild, acquired by child, released by parent
+
        // --- arch/proc.c's responsibility
        //! Kernel Stack Base
        tVAddr  KernelStack;
@@ -74,6 +90,10 @@ struct sThread
         int    CurFaultNum;    //!< Current fault number, 0: none
        tVAddr  FaultHandler;   //!< Fault Handler
        
+       
+        int    PendingSignal;  //!< Pending signal ID (0 = none)
+       
+       
        tMsg * volatile Messages;       //!< Message Queue
        tMsg    *LastMessage;   //!< Last Message (speeds up insertion)
        
@@ -88,14 +108,17 @@ struct sThread
        
        // --- event.c
        Uint32  EventState;
+       // --- timer.c
+       tTimer  ThreadTimer;
 };
 
 
-enum {
+enum eThreadStatus {
        THREAD_STAT_NULL,       // Invalid process
        THREAD_STAT_ACTIVE,     // Running and schedulable process
        THREAD_STAT_SLEEPING,   // Message Sleep
        THREAD_STAT_MUTEXSLEEP, // Mutex Sleep
+       THREAD_STAT_RWLOCKSLEEP,        // Read-Writer lock Sleep
        THREAD_STAT_SEMAPHORESLEEP,     // Semaphore Sleep
        THREAD_STAT_QUEUESLEEP, // Queue
        THREAD_STAT_EVENTSLEEP, // Event sleep
@@ -110,6 +133,7 @@ static const char * const casTHREAD_STAT[] = {
        "THREAD_STAT_ACTIVE",
        "THREAD_STAT_SLEEPING",
        "THREAD_STAT_MUTEXSLEEP",
+       "THREAD_STAT_RWLOCKSLEEP",
        "THREAD_STAT_SEMAPHORESLEEP",
        "THREAD_STAT_QUEUESLEEP",
        "THREAD_STAT_EVENTSLEEP",
@@ -119,14 +143,13 @@ static const char * const casTHREAD_STAT[] = {
        "THREAD_STAT_DEAD",
        "THREAD_STAT_BURIED"
 };
+static const unsigned int ciTHREAD_STAT_COUNT = sizeof(casTHREAD_STAT)/sizeof(casTHREAD_STAT[0]);
 
 // === GLOBALS ===
 extern BOOL    gaThreads_NoTaskSwitch[MAX_CPUS];
 extern tShortSpinlock  glThreadListLock;
 
 // === FUNCTIONS ===
-extern tThread *Proc_GetCurThread(void);
-
 extern tThread *Threads_GetThread(Uint TID);
 extern void    Threads_SetPriority(tThread *Thread, int Pri);
 extern int     Threads_Wake(tThread *Thread);
@@ -139,4 +162,8 @@ extern tThread      *Threads_GetNextToRun(int CPU, tThread *Last);
 extern tThread *Threads_CloneTCB(Uint Flags);
 extern tThread *Threads_CloneThreadZero(void);
 
+extern int     Threads_int_Sleep(enum eThreadStatus Status, void *Ptr, int Num, tThread **ListHead, tThread **ListTail, tShortSpinlock *Lock);
+extern void    Threads_int_WaitForStatusEnd(enum eThreadStatus Status);
+extern void    Semaphore_ForceWake(tThread *Thread);
+
 #endif

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