*/
tThread *Threads_CloneThreadZero(void)
{
- tThread *cur, *new;
+ tThread *new;
int i;
- cur = Proc_GetCurThread();
// Allocate and duplicate
new = malloc(sizeof(tThread));
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
// 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 );
}
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
*/
void Threads_Yield(void)
{
+// Log("Threads_Yield: by %p", __builtin_return_address(0));
Proc_Reschedule();
}
// 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: {
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);