summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/thread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/thread.cpp')
-rw-r--r--src/core/hle/kernel/thread.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index ab5a5559e..86bbf29d0 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -188,6 +188,43 @@ void ChangeThreadState(Thread* t, ThreadStatus new_status) {
188 } 188 }
189} 189}
190 190
191/// Arbitrate the highest priority thread that is waiting
192Handle ArbitrateHighestPriorityThread(u32 arbiter, u32 address) {
193 Handle highest_priority_thread = 0;
194 s32 priority = THREADPRIO_LOWEST;
195
196 // Iterate through threads, find highest priority thread that is waiting to be arbitrated...
197 for (const auto& handle : g_thread_queue) {
198
199 // TODO(bunnei): Verify arbiter address...
200 if (!VerifyWait(handle, WAITTYPE_ARB, arbiter))
201 continue;
202
203 Thread* thread = g_object_pool.GetFast<Thread>(handle);
204 if(thread->current_priority <= priority) {
205 highest_priority_thread = handle;
206 priority = thread->current_priority;
207 }
208 }
209 // If a thread was arbitrated, resume it
210 if (0 != highest_priority_thread)
211 ResumeThreadFromWait(highest_priority_thread);
212
213 return highest_priority_thread;
214}
215
216/// Arbitrate all threads currently waiting
217void ArbitrateAllThreads(u32 arbiter, u32 address) {
218
219 // Iterate through threads, find highest priority thread that is waiting to be arbitrated...
220 for (const auto& handle : g_thread_queue) {
221
222 // TODO(bunnei): Verify arbiter address...
223 if (VerifyWait(handle, WAITTYPE_ARB, arbiter))
224 ResumeThreadFromWait(handle);
225 }
226}
227
191/// Calls a thread by marking it as "ready" (note: will not actually execute until current thread yields) 228/// Calls a thread by marking it as "ready" (note: will not actually execute until current thread yields)
192void CallThread(Thread* t) { 229void CallThread(Thread* t) {
193 // Stop waiting 230 // Stop waiting