SHORTREL( &Thread->IsLocked ); // TODO: We may not actually be released...
// And, reschedule
- if(isCurThread) {
+ if(isCurThread)
+ {
for( ;; )
- HALT();
+ Proc_Reschedule();
}
}
*/
void Threads_Yield(void)
{
- tThread *thread = Proc_GetCurThread();
- thread->Remaining = 0;
- //while(thread->Remaining == 0)
- HALT();
+ Proc_Reschedule();
}
/**
// Release Spinlock
SHORTREL( &glThreadListLock );
-
- while(cur->Status != THREAD_STAT_ACTIVE) HALT();
+
+ while(cur->Status != THREAD_STAT_ACTIVE)
+ Proc_Reschedule();
}
/**
* \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
GetCPUNum(), ret, ret->TID, ret->ThreadName, giFreeTickets);
#endif
- SHORTREL( &glThreadListLock );
-
return ret;
}
if( gaThreads_NoTaskSwitch[CPU] )
return Last;
-
// Lock thread list
SHORTLOCK( &glThreadListLock );
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
{
// Make the new thread non-schedulable
thread->CurCPU = CPU;
+ thread->Remaining = thread->Quantum;
SHORTREL( &glThreadListLock );