X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fthreads.c;h=824cb169b5bbd7df66a842bb4e50ca349176ccbf;hb=ba8c9b788dd5b91dd172d2bbf07ae94e660ffd7d;hp=a4b3161a4bef0db89fa4fccd0fe503dc146885ef;hpb=c35233d2516362208e98542682f9196cbb3a844a;p=tpg%2Facess2.git diff --git a/Kernel/threads.c b/Kernel/threads.c index a4b3161a..824cb169 100644 --- a/Kernel/threads.c +++ b/Kernel/threads.c @@ -30,6 +30,7 @@ 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(); @@ -93,9 +94,9 @@ void Threads_Init() cur->ThreadName = "Idle Thread"; Threads_SetTickets(0); // Never called randomly cur->Quantum = 1; // 1 slice quantum + HALT(); for(;;) { - Log("Idle"); - __asm__ __volatile__ ("hlt"); // Just yeilds + HALT(); // Just yeilds } } #endif @@ -139,9 +140,7 @@ void Threads_SetTickets(int Num) * \brief Wait for a task to change state */ int Threads_WaitTID(int TID, int *status) -{ - Threads_Dump(); - +{ // Any Child if(TID == -1) { @@ -351,7 +350,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 ); @@ -424,6 +423,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) @@ -533,9 +548,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) {