X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fthreads.c;h=708c2ba0c463e1801b695747c0260e31e640574e;hb=e4b700d576ea9155c3fc86b0c57869a224851954;hp=1644b504b758ce35659b840db9207494467a6bdd;hpb=0259a3c08b2c7d5c9d05bd0d051a67399e755638;p=tpg%2Facess2.git diff --git a/Kernel/threads.c b/Kernel/threads.c index 1644b504..708c2ba0 100644 --- a/Kernel/threads.c +++ b/Kernel/threads.c @@ -23,12 +23,14 @@ 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); void Threads_Yield(); void Threads_Sleep(); void Threads_Wake(tThread *Thread); +void Threads_AddActive(tThread *Thread); int Threads_GetPID(); int Threads_GetTID(); int Threads_GetUID(); @@ -92,7 +94,12 @@ void Threads_Init() cur->ThreadName = "Idle Thread"; Threads_SetTickets(0); // Never called randomly cur->Quantum = 1; // 1 slice quantum - for(;;) __asm__ __volatile__ ("hlt"); // Just yeilds + HALT(); + for(;;) { + //Log("---- Idle"); + //Threads_Dump(); + HALT(); // Just yeilds + } } #endif @@ -136,6 +143,8 @@ void Threads_SetTickets(int Num) */ int Threads_WaitTID(int TID, int *status) { + Threads_Dump(); + // Any Child if(TID == -1) { @@ -164,10 +173,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; @@ -205,6 +215,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 @@ -298,14 +324,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; } @@ -322,7 +341,7 @@ void Threads_Kill(tThread *Thread, int Status) */ void Threads_Yield() { - Proc_GetCurThread()->Quantum = 0; + Proc_GetCurThread()->Remaining = 0; HALT(); } @@ -335,7 +354,7 @@ void Threads_Sleep() tThread *cur = Proc_GetCurThread(); tThread *thread; - //Log("Proc_Sleep: %i going to sleep", gCurrentThread->TID); + Log("Proc_Sleep: %i going to sleep", cur->TID); // Acquire Spinlock LOCK( &giThreadListLock ); @@ -408,6 +427,22 @@ void Threads_Wake(tThread *Thread) } } +/** + * \fn void Threads_AddActive(tThread *Thread) + * \brief Adds a thread to the active queue + */ +void Threads_AddActive(tThread *Thread) +{ + LOCK( &giThreadListLock ); + Thread->Next = gActiveThreads; + gActiveThreads = Thread; + giNumActiveThreads ++; + giTotalTickets += Thread->NumTickets; + //Log("Threads_AddActive: giNumActiveThreads = %i, giTotalTickets = %i", + // giNumActiveThreads, giTotalTickets); + RELEASE( &giThreadListLock ); +} + #if 0 /** * \fn void Threads_SetSignalHandler(int Num, void *Handler) @@ -517,9 +552,13 @@ tThread *Threads_GetNextToRun(int CPU) return gActiveThreads; } + Log(" Threads_GetNextToRun: giNumActiveThreads=%i,giTotalTickets=%i", + giNumActiveThreads, giTotalTickets); // Get the ticket number ticket = number = rand() % giTotalTickets; + Log(" Threads_GetNextToRun: ticket = %i", ticket); + // Find the next thread for(thread=gActiveThreads;thread;thread=thread->Next) {