X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fthreads.c;h=949f6d23e6d9d00c3b8e97e3d7a7deae8a41b9a6;hb=d710f435ed0d2b804ea82dba2dd122c4d6e5d08d;hp=a81736b19bcfdee96eb17a8ce1b9fcec9f7010e4;hpb=1b89e2cc55cd8d26923d45c7cccf5a0a651ed4c4;p=tpg%2Facess2.git diff --git a/Kernel/threads.c b/Kernel/threads.c index a81736b1..949f6d23 100644 --- a/Kernel/threads.c +++ b/Kernel/threads.c @@ -124,6 +124,7 @@ void Threads_Init(void) Log_Debug("Threads", "Offsets of tThread"); Log_Debug("Threads", ".Priority = %i", offsetof(tThread, Priority)); + Log_Debug("Threads", ".KernelStack = %i", offsetof(tThread, KernelStack)); // Create Initial Task #if SCHEDULER_TYPE == SCHED_RR_PRI @@ -232,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; @@ -245,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; @@ -308,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)); @@ -342,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 @@ -648,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 ); } @@ -663,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 @@ -679,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(); } @@ -716,8 +704,11 @@ 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); + } } @@ -744,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: { @@ -792,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); @@ -999,7 +988,7 @@ void Threads_SegFault(tVAddr 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); + MM_DumpTables(0, USER_MAX); Threads_Fault( 1 ); //Threads_Exit( 0, -1 ); } @@ -1292,7 +1281,7 @@ tThread *Threads_GetNextToRun(int CPU, tThread *Last) } // If we fall onto the same queue again, special handling is // needed - if( Last && i == Last->Priority ) { + if( Last && Last->Status == THREAD_STAT_ACTIVE && i == Last->Priority ) { tThread *savedThread = thread; // Find the next unscheduled thread in the list