X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fthreads.c;h=a81736b19bcfdee96eb17a8ce1b9fcec9f7010e4;hb=c43c05ef3234d6118ce601d299df60383d54ac7b;hp=fa6f6e0f57b4350c8120496861b9001c9dfcae46;hpb=952891ddb96a341c0e24ecb7dec6361c7bbeaece;p=tpg%2Facess2.git diff --git a/Kernel/threads.c b/Kernel/threads.c index fa6f6e0f..a81736b1 100644 --- a/Kernel/threads.c +++ b/Kernel/threads.c @@ -9,6 +9,7 @@ #include #include #include +#include // Configuration #define DEBUG_TRACE_TICKETS 0 // Trace ticket counts @@ -34,10 +35,6 @@ const enum eConfigTypes cCONFIG_TYPES[] = { }; // === IMPORTS === -extern void ArchThreads_Init(void); -extern void Proc_CallFaultHandler(tThread *Thread); -extern void Proc_DumpThreadCPUState(tThread *Thread); -extern int GetCPUNum(void); // === PROTOTYPES === void Threads_Init(void); @@ -670,9 +667,10 @@ void Threads_Kill(tThread *Thread, int Status) SHORTREL( &Thread->IsLocked ); // TODO: We may not actually be released... // And, reschedule - if(isCurThread) { + if(isCurThread) + { for( ;; ) - HALT(); + Proc_Reschedule(); } } @@ -681,10 +679,7 @@ void Threads_Kill(tThread *Thread, int Status) */ void Threads_Yield(void) { - tThread *thread = Proc_GetCurThread(); - thread->Remaining = 0; - //while(thread->Remaining == 0) - HALT(); + Proc_Reschedule(); } /** @@ -720,8 +715,9 @@ void Threads_Sleep(void) // Release Spinlock SHORTREL( &glThreadListLock ); - - while(cur->Status != THREAD_STAT_ACTIVE) HALT(); + + while(cur->Status != THREAD_STAT_ACTIVE) + Proc_Reschedule(); } @@ -852,7 +848,8 @@ void Threads_AddActive(tThread *Thread) if( Thread->Status == THREAD_STAT_ACTIVE ) { tThread *cur = Proc_GetCurThread(); - Warning("WTF, CPU%i %p (%i %s) is adding %p (%i %s) when it is active", + Log_Warning("Threads", "WTF, %p CPU%i %p (%i %s) is adding %p (%i %s) when it is active", + __builtin_return_address(0), GetCPUNum(), cur, cur->TID, cur->ThreadName, Thread, Thread->TID, Thread->ThreadName); SHORTREL( &glThreadListLock ); return ; @@ -907,14 +904,17 @@ void Threads_AddActive(tThread *Thread) /** * \brief Removes the current thread from the active queue - * \warning This should ONLY be called with task switches disabled + * \warning This should ONLY be called with the lock held * \return Current thread pointer */ tThread *Threads_RemActive(void) { tThread *ret = Proc_GetCurThread(); - - SHORTLOCK( &glThreadListLock ); + + if( !IS_LOCKED(&glThreadListLock) ) { + Log_KernelPanic("Threads", "Threads_RemActive called without lock held"); + return NULL; + } // Delete from active queue #if SCHEDULER_TYPE == SCHED_RR_PRI @@ -941,8 +941,6 @@ tThread *Threads_RemActive(void) GetCPUNum(), ret, ret->TID, ret->ThreadName, giFreeTickets); #endif - SHORTREL( &glThreadListLock ); - return ret; } @@ -982,6 +980,7 @@ void Threads_Fault(int Num) // Double Fault? Oh, F**k if(thread->CurFaultNum != 0) { + Log_Warning("Threads", "Threads_Fault: Double fault on %i", thread->TID); Threads_Kill(thread, -1); // For now, just kill HALT(); } @@ -997,7 +996,10 @@ void Threads_Fault(int Num) */ void Threads_SegFault(tVAddr Addr) { - Warning("Thread #%i committed a segfault at address %p", Proc_GetCurThread()->TID, Addr); + tThread *cur = Proc_GetCurThread(); + cur->bInstrTrace = 0; + Log_Warning("Threads", "Thread #%i committed a segfault at address %p", cur->TID, Addr); + MM_DumpTables(0, KERNEL_BASE); Threads_Fault( 1 ); //Threads_Exit( 0, -1 ); } @@ -1139,7 +1141,6 @@ tThread *Threads_GetNextToRun(int CPU, tThread *Last) if( gaThreads_NoTaskSwitch[CPU] ) return Last; - // Lock thread list SHORTLOCK( &glThreadListLock ); @@ -1312,6 +1313,9 @@ tThread *Threads_GetNextToRun(int CPU, tThread *Last) SHORTREL(&glThreadListLock); return NULL; } + if( thread->Status != THREAD_STAT_ACTIVE ) { + LogF("Oops, Thread %i (%s) is not active\n", thread->TID, thread->ThreadName); + } } #elif SCHEDULER_TYPE == SCHED_RR_SIM { @@ -1341,6 +1345,7 @@ tThread *Threads_GetNextToRun(int CPU, tThread *Last) // Make the new thread non-schedulable thread->CurCPU = CPU; + thread->Remaining = thread->Quantum; SHORTREL( &glThreadListLock );