Fixes to Libc, Doxygen Comments and VTerm layout
[tpg/acess2.git] / Kernel / threads.c
index e244139..00fc050 100644 (file)
@@ -265,7 +265,12 @@ int Threads_WaitTID(int TID, int *status)
                tThread *t = Threads_GetThread(TID);
                 int    initStatus = t->Status;
                 int    ret;
-               while(t->Status == initStatus)  Threads_Yield();
+               
+               if(initStatus != THREAD_STAT_ZOMBIE)
+                       while(t->Status == initStatus) {
+                               Threads_Yield();
+                       }
+               
                ret = t->RetStatus;
                switch(t->Status)
                {
@@ -330,7 +335,7 @@ void Threads_AddToDelete(tThread *Thread)
 }
 
 /**
- * \fn tThread *Threads_int_GetPrev(tThread *List, tThread *Thread)
+ * \fn tThread *Threads_int_GetPrev(tThread **List, tThread *Thread)
  * \brief Gets the previous entry in a thead linked list
  */
 tThread *Threads_int_GetPrev(tThread **List, tThread *Thread)
@@ -362,12 +367,14 @@ void Threads_Exit(int TID, int Status)
                Threads_Kill( Proc_GetCurThread(), (Uint)Status & 0xFF );
        else
                Threads_Kill( Threads_GetThread(TID), (Uint)Status & 0xFF );
+       for(;;) HALT(); // Just in case
 }
 
 /**
  * \fn void Threads_Kill(tThread *Thread, int Status)
  * \brief Kill a thread
- * \param TID  Thread ID (0 for current)
+ * \param Thread       Thread to kill
+ * \param Status       Status code to return to the parent
  */
 void Threads_Kill(tThread *Thread, int Status)
 {
@@ -433,6 +440,9 @@ void Threads_Kill(tThread *Thread, int Status)
        // Release spinlocks
        RELEASE( &Thread->IsLocked );   // Released first so that it IS released
        RELEASE( &giThreadListLock );
+       
+       //Log("Thread %i went *hurk*", Thread->TID);
+       
        if(Status != -1)        HALT();
 }
 
@@ -455,7 +465,7 @@ void Threads_Sleep()
        tThread *cur = Proc_GetCurThread();
        tThread *thread;
        
-       //Log("Proc_Sleep: %i going to sleep", cur->TID);
+       Log("Proc_Sleep: %i going to sleep", cur->TID);
        
        // Acquire Spinlock
        LOCK( &giThreadListLock );
@@ -463,7 +473,8 @@ void Threads_Sleep()
        // Get thread before current thread
        thread = Threads_int_GetPrev( &gActiveThreads, cur );
        if(!thread) {
-               Warning("Proc_Sleep - Current thread is not on the active queue");
+               Warning("Threads_Sleep - Current thread is not on the active queue");
+               Threads_Dump();
                return;
        }
        
@@ -493,11 +504,11 @@ void Threads_Sleep()
        // Release Spinlock
        RELEASE( &giThreadListLock );
        
-       HALT();
+       while(cur->Status != THREAD_STAT_ACTIVE)        HALT();
 }
 
 
-/**c0108919:
+/**
  * \fn void Threads_Wake( tThread *Thread )
  * \brief Wakes a sleeping/waiting thread up
  */
@@ -621,18 +632,23 @@ int Threads_GetGID()
 void Threads_Dump()
 {
        tThread *thread;
+       tThread *cur = Proc_GetCurThread();
        
        Log("Active Threads:");
        for(thread=gActiveThreads;thread;thread=thread->Next)
        {
-               Log(" %i (%i) - %s", thread->TID, thread->TGID, thread->ThreadName);
+               Log("%c%i (%i) - %s",
+                       (thread==cur?'*':' '),
+                       thread->TID, thread->TGID, thread->ThreadName);
                Log("  %i Tickets, Quantum %i", thread->NumTickets, thread->Quantum);
                Log("  KStack 0x%x", thread->KernelStack);
        }
        Log("Sleeping Threads:");
        for(thread=gSleepingThreads;thread;thread=thread->Next)
        {
-               Log(" %i (%i) - %s", thread->TID, thread->TGID, thread->ThreadName);
+               Log("%c%i (%i) - %s",
+                       (thread==cur?'*':' '),
+                       thread->TID, thread->TGID, thread->ThreadName);
                Log("  %i Tickets, Quantum %i", thread->NumTickets, thread->Quantum);
                Log("  KStack 0x%x", thread->KernelStack);
        }
@@ -689,6 +705,6 @@ tThread *Threads_GetNextToRun(int CPU)
 void Threads_SegFault(tVAddr Addr)
 {
        //Threads_SendSignal( Proc_GetCurThread()->TID, SIGSEGV );
-       Log("Thread #%i committed a segfault at address %p\n", Proc_GetCurThread()->TID, Addr);
-       Threads_Exit( 0, 0 );
+       Warning("Thread #%i committed a segfault at address %p", Proc_GetCurThread()->TID, Addr);
+       Threads_Exit( 0, -1 );
 }

UCC git Repository :: git.ucc.asn.au