From 5e77e2e1de73ce7786f52f2a74c28182fa4aa845 Mon Sep 17 00:00:00 2001
From: bunnei <bunneidev@gmail.com>
Date: Wed, 14 Jan 2015 23:19:22 -0500
Subject: [PATCH] WaitObject: Added RemoveWaitingThread, fixed a bug, and
 cleanup.

---
 src/core/hle/kernel/kernel.cpp | 13 ++++++++++---
 src/core/hle/kernel/kernel.h   |  8 +++++++-
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 07e96e633b..1dba85939e 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -19,13 +19,20 @@ HandleTable g_handle_table;
 u64 g_program_id = 0;
 
 void WaitObject::AddWaitingThread(Thread* thread) {
-    if (std::find(waiting_threads.begin(), waiting_threads.end(), thread) == waiting_threads.end()) {
+    auto itr = std::find(waiting_threads.begin(), waiting_threads.end(), thread);
+    if (itr == waiting_threads.end())
         waiting_threads.push_back(thread);
-    }
+}
+
+void WaitObject::RemoveWaitingThread(Thread* thread) {
+    auto itr = std::find(waiting_threads.begin(), waiting_threads.end(), thread);
+    if (itr != waiting_threads.end())
+        waiting_threads.erase(itr);
 }
 
 Thread* WaitObject::ResumeNextThread() {
-    if (waiting_threads.empty()) return nullptr;
+    if (waiting_threads.empty())
+        return nullptr;
 
     auto next_thread = waiting_threads.front();
 
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index a9af9de887..53b3f91438 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -105,7 +105,13 @@ public:
     void AddWaitingThread(Thread* thread);
 
     /**
-     * Resumes the next thread waiting on this object
+     * Removes a thread from waiting on this object (e.g. if it was resumed already)
+     * @param thread Pointer to thread to remove
+     */
+    void RemoveWaitingThread(Thread* thead);
+
+    /**
+     * Resumes (and removes) the next thread waiting on this object
      * @return Pointer to the thread that was resumed, nullptr if no threads are waiting
      */
     Thread* ResumeNextThread();