X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Kernel%2Fthreads.c;h=949f6d23e6d9d00c3b8e97e3d7a7deae8a41b9a6;hb=9a70d1ed74070f56c34b856f88931b134d429c3a;hp=76041f58b4f713533786339488d690f134e2378b;hpb=dc42c3998b01e66a609fed5d503a81a972e636d6;p=tpg%2Facess2.git diff --git a/Kernel/threads.c b/Kernel/threads.c index 76041f58..949f6d23 100644 --- a/Kernel/threads.c +++ b/Kernel/threads.c @@ -311,9 +311,8 @@ tThread *Threads_CloneTCB(Uint Flags) */ tThread *Threads_CloneThreadZero(void) { - tThread *cur, *new; + tThread *new; int i; - cur = Proc_GetCurThread(); // Allocate and duplicate new = malloc(sizeof(tThread)); @@ -340,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 @@ -646,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 ); } @@ -661,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 @@ -677,6 +666,7 @@ void Threads_Kill(tThread *Thread, int Status) */ void Threads_Yield(void) { +// Log("Threads_Yield: by %p", __builtin_return_address(0)); Proc_Reschedule(); } @@ -745,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: { @@ -793,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);