Usermode/AxWin3 - Debugging IPC
[tpg/acess2.git] / Kernel / threads.c
index f586f68..2f8d933 100644 (file)
@@ -14,7 +14,7 @@
 // Configuration
 #define DEBUG_TRACE_TICKETS    0       // Trace ticket counts
 #define DEBUG_TRACE_STATE      0       // Trace state changes (sleep/wake)
-#define SEMAPHORE_DEBUG        0
+#define SEMAPHORE_DEBUG        0       // Debug semaphores
 
 // --- Schedulers ---
 #define SCHED_UNDEF    0
@@ -233,12 +233,10 @@ void Threads_SetPriority(tThread *Thread, int Pri)
 }
 
 /**
- * \fn tThread *Threads_CloneTCB(Uint *Err, Uint Flags)
  * \brief Clone the TCB of the current thread
- * \param Err  Error pointer
  * \param Flags        Flags for something... (What is this for?)
  */
-tThread *Threads_CloneTCB(Uint *Err, Uint Flags)
+tThread *Threads_CloneTCB(Uint Flags)
 {
        tThread *cur, *new;
         int    i;
@@ -246,7 +244,7 @@ tThread *Threads_CloneTCB(Uint *Err, Uint Flags)
        
        // Allocate and duplicate
        new = malloc(sizeof(tThread));
-       if(new == NULL) { *Err = -ENOMEM; return NULL; }
+       if(new == NULL) { errno = -ENOMEM; return NULL; }
        memcpy(new, cur, sizeof(tThread));
        
        new->CurCPU = -1;
@@ -309,14 +307,12 @@ tThread *Threads_CloneTCB(Uint *Err, Uint Flags)
 }
 
 /**
- * \fn tThread *Threads_CloneTCB(Uint *Err, Uint Flags)
- * \brief Clone the TCB of the current thread
+ * \brief Clone the TCB of the kernel thread
  */
 tThread *Threads_CloneThreadZero(void)
 {
-       tThread *cur, *new;
+       tThread *new;
         int    i;
-       cur = Proc_GetCurThread();
        
        // Allocate and duplicate
        new = malloc(sizeof(tThread));
@@ -343,28 +339,17 @@ tThread *Threads_CloneThreadZero(void)
        new->LastMessage = NULL;
        
        // Set State
-       new->Remaining = new->Quantum = cur->Quantum;
-       new->Priority = cur->Priority;
+       new->Remaining = new->Quantum = DEFAULT_QUANTUM;
+       new->Priority = DEFAULT_PRIORITY;
        new->bInstrTrace = 0;
        
        // Set Signal Handlers
        new->CurFaultNum = 0;
-       new->FaultHandler = cur->FaultHandler;
+       new->FaultHandler = 0;
        
        for( i = 0; i < NUM_CFG_ENTRIES; i ++ )
        {
-               switch(cCONFIG_TYPES[i])
-               {
-               default:
-                       new->Config[i] = cur->Config[i];
-                       break;
-               case CFGT_HEAPSTR:
-                       if(cur->Config[i])
-                               new->Config[i] = (Uint) strdup( (void*)cur->Config[i] );
-                       else
-                               new->Config[i] = 0;
-                       break;
-               }
+               new->Config[i] = 0;
        }
        
        // Maintain a global list of threads
@@ -633,7 +618,7 @@ void Threads_Kill(tThread *Thread, int Status)
                }
                break;
        
-       // Brains!... You cannot kill
+       // Brains!... You cannot kill something that is already dead
        case THREAD_STAT_ZOMBIE:
                Log_Warning("Threads", "Threads_Kill - Thread %p(%i,%s) is undead, you cannot kill it",
                        Thread, Thread->TID, Thread->ThreadName);
@@ -649,24 +634,24 @@ void Threads_Kill(tThread *Thread, int Status)
        
        // Save exit status
        Thread->RetStatus = Status;
-       
+
+       SHORTREL( &Thread->IsLocked );
+
        // Don't Zombie if we are being killed because our parent is
        if(Status == -1)
        {
                Thread->Status = THREAD_STAT_DEAD;
                Threads_AddToDelete( Thread );
+               SHORTREL( &glThreadListLock );
        } else {
                Thread->Status = THREAD_STAT_ZOMBIE;
+               SHORTREL( &glThreadListLock );
                // Wake parent
                Threads_Wake( Thread->Parent );
        }
        
        Log("Thread %i went *hurk* (%i)", Thread->TID, Status);
        
-       // Release spinlocks
-       SHORTREL( &glThreadListLock );
-       SHORTREL( &Thread->IsLocked );  // TODO: We may not actually be released...
-       
        // And, reschedule
        if(isCurThread)
        {
@@ -680,6 +665,7 @@ void Threads_Kill(tThread *Thread, int Status)
  */
 void Threads_Yield(void)
 {
+//     Log("Threads_Yield: by %p", __builtin_return_address(0));
        Proc_Reschedule();
 }
 
@@ -717,13 +703,15 @@ void Threads_Sleep(void)
        // Release Spinlock
        SHORTREL( &glThreadListLock );
 
-       while(cur->Status != THREAD_STAT_ACTIVE)
+       while(cur->Status != THREAD_STAT_ACTIVE) {
                Proc_Reschedule();
+               if( cur->Status != THREAD_STAT_ACTIVE )
+                       Log("%i - Huh? why am I up? zzzz...", cur->TID);
+       }
 }
 
 
 /**
- * \fn int Threads_Wake( tThread *Thread )
  * \brief Wakes a sleeping/waiting thread up
  * \param Thread       Thread to wake
  * \return Boolean Failure (Returns ERRNO)
@@ -745,12 +733,12 @@ int Threads_Wake(tThread *Thread)
                // Remove from sleeping queue
                Threads_int_DelFromQueue(&gSleepingThreads, Thread);
                
+               SHORTREL( &glThreadListLock );
                Threads_AddActive( Thread );
                
                #if DEBUG_TRACE_STATE
                Log("Threads_Sleep: %p (%i %s) woken", Thread, Thread->TID, Thread->ThreadName);
                #endif
-               SHORTREL( &glThreadListLock );
                return -EOK;
        
        case THREAD_STAT_SEMAPHORESLEEP: {
@@ -793,9 +781,8 @@ int Threads_Wake(tThread *Thread)
                                sem->LastSignaling = prev;
                }
                
-               SHORTLOCK( &glThreadListLock );
+               Thread->RetStatus = 0;  // It didn't get anything
                Threads_AddActive( Thread );
-               SHORTREL( &glThreadListLock );
                
                #if DEBUG_TRACE_STATE
                Log("Threads_Sleep: %p(%i %s) woken from semaphore", Thread, Thread->TID, Thread->ThreadName);
@@ -1521,8 +1508,17 @@ int Semaphore_Wait(tSemaphore *Sem, int MaxToTake)
                #endif
                
                SHORTREL( &Sem->Protector );    // Release first to make sure it is released
-               SHORTREL( &glThreadListLock );  
-               while(us->Status == THREAD_STAT_SEMAPHORESLEEP) Threads_Yield();
+               SHORTREL( &glThreadListLock );
+               while( us->Status == THREAD_STAT_SEMAPHORESLEEP )
+               {
+                       Threads_Yield();
+                       if(us->Status == THREAD_STAT_SEMAPHORESLEEP)
+                               Log_Warning("Threads", "Semaphore %p %s:%s re-schedulued while asleep",
+                                       Sem, Sem->ModName, Sem->Name);
+               }
+               #if DEBUG_TRACE_STATE || SEMAPHORE_DEBUG
+               Log("Semaphore %p %s:%s woken", Sem, Sem->ModName, Sem->Name);
+               #endif
                // We're only woken when there's something avaliable (or a signal arrives)
                us->WaitPointer = NULL;
                
@@ -1569,6 +1565,11 @@ int Semaphore_Wait(tSemaphore *Sem, int MaxToTake)
        }
        SHORTREL( &Sem->Protector );
        
+       #if DEBUG_TRACE_STATE || SEMAPHORE_DEBUG
+       Log("Semaphore %p %s:%s took %i by wait",
+               Sem, Sem->ModName, Sem->Name, taken);
+       #endif
+
        return taken;
 }
 
@@ -1673,12 +1674,12 @@ int Semaphore_Signal(tSemaphore *Sem, int AmmountToAdd)
                #endif
                
                // Wake the sleeper
-               SHORTLOCK( &glThreadListLock );
+//             SHORTLOCK( &glThreadListLock );
                if( toWake->Status != THREAD_STAT_ACTIVE )
                        Threads_AddActive(toWake);
                else
                        Warning("Thread %p (%i %s) is already awake", toWake, toWake->TID, toWake->ThreadName);
-               SHORTREL( &glThreadListLock );
+//             SHORTREL( &glThreadListLock );
        }
        SHORTREL( &Sem->Protector );
        

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