X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Finclude%2Fthreads_int.h;h=1c9a08d79342b1f0c964660fa1308b0fb2beb46e;hb=bdab8e5cebaf249d291d19523d0358f8c1c98008;hp=66bb8c16379dd055646f96ef62850eef3eda0470;hpb=51ab5f489bc356940c95cc936fd0508e8f07ea97;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/include/threads_int.h b/KernelLand/Kernel/include/threads_int.h index 66bb8c16..1c9a08d7 100644 --- a/KernelLand/Kernel/include/threads_int.h +++ b/KernelLand/Kernel/include/threads_int.h @@ -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 #include - +#include +#include 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