X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fthreads.c;h=1ccac9f68ca495b152ee5ecfb1e86843a47acad1;hb=72fcc8d0873e91f713be3d23af32a4e83f40cdf5;hp=27356613be9b79bbf7b0a28034f2c63c0e11c3f5;hpb=35e419b3110ef56ffdc3f16c1fc819874b888ba5;p=tpg%2Facess2.git diff --git a/Kernel/threads.c b/Kernel/threads.c index 27356613..1ccac9f6 100644 --- a/Kernel/threads.c +++ b/Kernel/threads.c @@ -13,6 +13,7 @@ // === IMPORTS === extern void ArchThreads_Init(); +extern void Proc_Start(); extern tThread *Proc_GetCurThread(); extern int Proc_Clone(Uint *Err, Uint Flags); @@ -22,6 +23,7 @@ void Threads_SetName(char *NewName); void Threads_SetTickets(int Num); int Threads_WaitTID(int TID, int *status); tThread *Threads_GetThread(Uint TID); +void Threads_AddToDelete(tThread *Thread); tThread *Threads_int_GetPrev(tThread **List, tThread *Thread); void Threads_Exit(int TID, int Status); void Threads_Kill(tThread *Thread, int Status); @@ -94,6 +96,8 @@ void Threads_Init() for(;;) __asm__ __volatile__ ("hlt"); // Just yeilds } #endif + + Proc_Start(); } /** @@ -161,10 +165,11 @@ int Threads_WaitTID(int TID, int *status) { case THREAD_STAT_ZOMBIE: t->Status = THREAD_STAT_DEAD; - *status = 0; + if(status) *status = 0; + Threads_AddToDelete( t ); break; default: - *status = -1; + if(status) *status = -1; break; } return ret; @@ -202,6 +207,22 @@ tThread *Threads_GetThread(Uint TID) return NULL; } +/** + * \fn void Threads_AddToDelete(tThread *Thread) + * \brief Adds a thread to the delete queue + */ +void Threads_AddToDelete(tThread *Thread) +{ + // Add to delete queue + if(gDeleteThreads) { + Thread->Next = gDeleteThreads; + gDeleteThreads = Thread; + } else { + Thread->Next = NULL; + gDeleteThreads = Thread; + } +} + /** * \fn tThread *Threads_int_GetPrev(tThread *List, tThread *Thread) * \brief Gets the previous entry in a thead linked list @@ -295,14 +316,7 @@ void Threads_Kill(tThread *Thread, int Status) if(Status == -1) { Thread->Status = THREAD_STAT_DEAD; - // Add to delete queue - if(gDeleteThreads) { - Thread->Next = gDeleteThreads; - gDeleteThreads = Thread; - } else { - Thread->Next = NULL; - gDeleteThreads = Thread; - } + Threads_AddToDelete( Thread ); } else { Thread->Status = THREAD_STAT_ZOMBIE; }