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
// 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);
+ }
}
/**
* \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;
}
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 );
}
}
// 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
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
{