yuzu-emu
/
yuzu-mainline
Archived
1
0
Fork 0

Thread: Added functions to resume threads from address arbitration.

Thread: Cleaned up arbitrate address functions.

Thread: Cleaned up ArbitrateAllThreads function.
This commit is contained in:
bunnei 2014-07-06 22:48:19 -04:00
parent 59f2750482
commit ba840d3200
2 changed files with 44 additions and 0 deletions

View File

@ -188,6 +188,43 @@ void ChangeThreadState(Thread* t, ThreadStatus new_status) {
} }
} }
/// Arbitrate the highest priority thread that is waiting
Handle ArbitrateHighestPriorityThread(u32 arbiter, u32 address) {
Handle highest_priority_thread = 0;
s32 priority = THREADPRIO_LOWEST;
// Iterate through threads, find highest priority thread that is waiting to be arbitrated...
for (const auto& handle : g_thread_queue) {
// TODO(bunnei): Verify arbiter address...
if (!VerifyWait(handle, WAITTYPE_ARB, arbiter))
continue;
Thread* thread = g_object_pool.GetFast<Thread>(handle);
if(thread->current_priority <= priority) {
highest_priority_thread = handle;
priority = thread->current_priority;
}
}
// If a thread was arbitrated, resume it
if (0 != highest_priority_thread)
ResumeThreadFromWait(highest_priority_thread);
return highest_priority_thread;
}
/// Arbitrate all threads currently waiting
void ArbitrateAllThreads(u32 arbiter, u32 address) {
// Iterate through threads, find highest priority thread that is waiting to be arbitrated...
for (const auto& handle : g_thread_queue) {
// TODO(bunnei): Verify arbiter address...
if (VerifyWait(handle, WAITTYPE_ARB, arbiter))
ResumeThreadFromWait(handle);
}
}
/// Calls a thread by marking it as "ready" (note: will not actually execute until current thread yields) /// Calls a thread by marking it as "ready" (note: will not actually execute until current thread yields)
void CallThread(Thread* t) { void CallThread(Thread* t) {
// Stop waiting // Stop waiting

View File

@ -39,6 +39,7 @@ enum WaitType {
WAITTYPE_VBLANK, WAITTYPE_VBLANK,
WAITTYPE_MUTEX, WAITTYPE_MUTEX,
WAITTYPE_SYNCH, WAITTYPE_SYNCH,
WAITTYPE_ARB,
}; };
namespace Kernel { namespace Kernel {
@ -59,6 +60,12 @@ void StopThread(Handle thread, const char* reason);
/// Resumes a thread from waiting by marking it as "ready" /// Resumes a thread from waiting by marking it as "ready"
void ResumeThreadFromWait(Handle handle); void ResumeThreadFromWait(Handle handle);
/// Arbitrate the highest priority thread that is waiting
Handle ArbitrateHighestPriorityThread(u32 arbiter, u32 address);
/// Arbitrate all threads currently waiting...
void ArbitrateAllThreads(u32 arbiter, u32 address);
/// Gets the current thread handle /// Gets the current thread handle
Handle GetCurrentThreadHandle(); Handle GetCurrentThreadHandle();