Kernel: Add some asserts to enforce the invariants in the scheduler.
This commit is contained in:
		| @@ -27,6 +27,9 @@ void WaitObject::AddWaitingThread(SharedPtr<Thread> thread) { | ||||
|  | ||||
| void WaitObject::RemoveWaitingThread(Thread* thread) { | ||||
|     auto itr = std::find(waiting_threads.begin(), waiting_threads.end(), thread); | ||||
|     // If a thread passed multiple handles to the same object, | ||||
|     // the kernel might attempt to remove the thread from the object's | ||||
|     // waiting threads list multiple times. | ||||
|     if (itr != waiting_threads.end()) | ||||
|         waiting_threads.erase(itr); | ||||
| } | ||||
| @@ -36,6 +39,11 @@ SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() { | ||||
|     s32 candidate_priority = THREADPRIO_LOWEST + 1; | ||||
|  | ||||
|     for (const auto& thread : waiting_threads) { | ||||
|         // The list of waiting threads must not contain threads that are not waiting to be awakened. | ||||
|         ASSERT_MSG(thread->status == THREADSTATUS_WAIT_SYNCH_ANY || | ||||
|                        thread->status == THREADSTATUS_WAIT_SYNCH_ALL, | ||||
|                    "Inconsistent thread statuses in waiting_threads"); | ||||
|  | ||||
|         if (thread->current_priority >= candidate_priority) | ||||
|             continue; | ||||
|  | ||||
|   | ||||
| @@ -200,7 +200,7 @@ static void SwitchContext(Thread* new_thread) { | ||||
|  | ||||
|     // Load context of new thread | ||||
|     if (new_thread) { | ||||
|         DEBUG_ASSERT_MSG(new_thread->status == THREADSTATUS_READY, | ||||
|         ASSERT_MSG(new_thread->status == THREADSTATUS_READY, | ||||
|                    "Thread must be ready to become running."); | ||||
|  | ||||
|         // Cancel any outstanding wakeup events for this thread | ||||
| @@ -307,6 +307,8 @@ void Thread::WakeAfterDelay(s64 nanoseconds) { | ||||
| } | ||||
|  | ||||
| void Thread::ResumeFromWait() { | ||||
|     ASSERT_MSG(wait_objects.empty(), "Thread is waking up while waiting for objects"); | ||||
|  | ||||
|     switch (status) { | ||||
|     case THREADSTATUS_WAIT_SYNCH_ALL: | ||||
|     case THREADSTATUS_WAIT_SYNCH_ANY: | ||||
| @@ -580,6 +582,7 @@ void Thread::SetWaitSynchronizationOutput(s32 output) { | ||||
| } | ||||
|  | ||||
| s32 Thread::GetWaitObjectIndex(WaitObject* object) const { | ||||
|     ASSERT_MSG(!wait_objects.empty(), "Thread is not waiting for anything"); | ||||
|     auto match = std::find(wait_objects.rbegin(), wait_objects.rend(), object); | ||||
|     return std::distance(match, wait_objects.rend()) - 1; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user