X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fthreads.c;h=949f6d23e6d9d00c3b8e97e3d7a7deae8a41b9a6;hb=d710f435ed0d2b804ea82dba2dd122c4d6e5d08d;hp=57382a8ca9d7303898e9fcb50bc5cdb1a480122a;hpb=f830c3b9bc88e968d34ea935e2125674d3a504b0;p=tpg%2Facess2.git diff --git a/Kernel/threads.c b/Kernel/threads.c index 57382a8c..949f6d23 100644 --- a/Kernel/threads.c +++ b/Kernel/threads.c @@ -634,14 +634,16 @@ void Threads_Kill(tThread *Thread, int Status) // Save exit status Thread->RetStatus = Status; - + // 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 ); } @@ -649,7 +651,6 @@ void Threads_Kill(tThread *Thread, int Status) 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 @@ -665,7 +666,7 @@ void Threads_Kill(tThread *Thread, int Status) */ void Threads_Yield(void) { - Log("Threads_Yield: by %p", __builtin_return_address(0)); +// Log("Threads_Yield: by %p", __builtin_return_address(0)); Proc_Reschedule(); } @@ -734,12 +735,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: { @@ -782,9 +783,7 @@ int Threads_Wake(tThread *Thread) sem->LastSignaling = prev; } - SHORTLOCK( &glThreadListLock ); Threads_AddActive( Thread ); - SHORTREL( &glThreadListLock ); #if DEBUG_TRACE_STATE Log("Threads_Sleep: %p(%i %s) woken from semaphore", Thread, Thread->TID, Thread->ThreadName);