X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Kernel%2Fthreads.c;h=bcea3fa9bbfdf327958995487f099883f523027a;hb=1a96e0dd77d6922078edd703fc7c2e809b9499b8;hp=bb0ec73a8afec18c0dd1ab44fdc9533d9fb3f976;hpb=eb106b6fa9ebd3710f667b88bcc0924dc0eef099;p=tpg%2Facess2.git diff --git a/Kernel/threads.c b/Kernel/threads.c index bb0ec73a..bcea3fa9 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(); @@ -95,8 +96,6 @@ void Threads_Init() cur->Quantum = 1; // 1 slice quantum HALT(); for(;;) { - //Log("---- Idle"); - //Threads_Dump(); HALT(); // Just yeilds } } @@ -141,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) { @@ -259,7 +256,10 @@ tThread *Threads_int_GetPrev(tThread **List, tThread *Thread) */ void Threads_Exit(int TID, int Status) { - Threads_Kill( Proc_GetCurThread(), (Uint)Status & 0xFF ); + if( TID == 0 ) + Threads_Kill( Proc_GetCurThread(), (Uint)Status & 0xFF ); + else + Threads_Kill( Threads_GetThread(TID), (Uint)Status & 0xFF ); } /** @@ -273,14 +273,14 @@ void Threads_Kill(tThread *Thread, int Status) tMsg *msg; // Kill all children - #if 0 + #if 1 { tThread *child; for(child = gActiveThreads; child; child = child->Next) { - if(child->PTID == gCurrentThread->TID) + if(child->PTID == Thread->TID) Threads_Kill(child, -1); } } @@ -426,6 +426,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) @@ -440,6 +456,7 @@ void Threads_SetSignalHandler(int Num, void *Handler) /** * \fn void Threads_SendSignal(int TID, int Num) + * \brief Send a signal to a thread */ void Threads_SendSignal(int TID, int Num) { @@ -535,11 +552,13 @@ tThread *Threads_GetNextToRun(int CPU) return gActiveThreads; } - Log("giNumActiveThreads=%i,giTotalTickets=%i", - giNumActiveThreads, giTotalTickets); + //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) { @@ -559,3 +578,13 @@ tThread *Threads_GetNextToRun(int CPU) return thread; } + +/** + * \fn void Threads_SegFault(tVAddr Addr) + * \brief Called when a Segment Fault occurs + */ +void Threads_SegFault(tVAddr Addr) +{ + //Threads_SendSignal( Proc_GetCurThread()->TID, SIGSEGV ); + Threads_Kill( Proc_GetCurThread(), 0 ); +}