summaryrefslogtreecommitdiffstats
path: root/src/core/hle
diff options
context:
space:
mode:
authorYuri Kunde Schlesner <yuriks@yuriks.net>2014-11-24 18:51:50 +0100
committerYuri Kunde Schlesner <yuriks@yuriks.net>2014-11-24 20:08:37 +0100
commit8189593255df8ab4abb699082f2c48baa3b0656b (patch)
tree9c3ff113839583d1deca837e9888d81f25d485a0 /src/core/hle
parentRemove duplicated docs/update them for changed parameters. (diff)
downloadyuzu-8189593255df8ab4abb699082f2c48baa3b0656b.tar
yuzu-8189593255df8ab4abb699082f2c48baa3b0656b.tar.gz
yuzu-8189593255df8ab4abb699082f2c48baa3b0656b.tar.bz2
yuzu-8189593255df8ab4abb699082f2c48baa3b0656b.tar.lz
yuzu-8189593255df8ab4abb699082f2c48baa3b0656b.tar.xz
yuzu-8189593255df8ab4abb699082f2c48baa3b0656b.tar.zst
yuzu-8189593255df8ab4abb699082f2c48baa3b0656b.zip
Diffstat (limited to 'src/core/hle')
-rw-r--r--src/core/hle/kernel/thread.cpp34
1 files changed, 15 insertions, 19 deletions
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index 2521f883d..f3f54a4e9 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -35,16 +35,16 @@ public:
inline bool IsSuspended() const { return (status & THREADSTATUS_SUSPEND) != 0; }
ResultVal<bool> WaitSynchronization() override {
- if (status != THREADSTATUS_DORMANT) {
+ const bool wait = status != THREADSTATUS_DORMANT;
+ if (wait) {
Handle thread = GetCurrentThreadHandle();
if (std::find(waiting_threads.begin(), waiting_threads.end(), thread) == waiting_threads.end()) {
waiting_threads.push_back(thread);
}
WaitCurrentThread(WAITTYPE_THREADEND, this->GetHandle());
- return MakeResult<bool>(true);
- } else {
- return MakeResult<bool>(false);
}
+
+ return MakeResult<bool>(wait);
}
ThreadContext context;
@@ -141,14 +141,9 @@ void ChangeReadyState(Thread* t, bool ready) {
}
/// Verify that a thread has not been released from waiting
-inline bool VerifyWait(Handle handle, WaitType type, Handle wait_handle) {
- Thread* thread = g_object_pool.Get<Thread>(handle);
+inline bool VerifyWait(const Thread* thread, WaitType type, Handle wait_handle) {
_dbg_assert_(KERNEL, thread != nullptr);
-
- if (type != thread->wait_type || wait_handle != thread->wait_handle)
- return false;
-
- return true;
+ return type == thread->wait_type && wait_handle == thread->wait_handle;
}
/// Stops the current thread
@@ -158,10 +153,10 @@ ResultCode StopThread(Handle handle, const char* reason) {
ChangeReadyState(thread, false);
thread->status = THREADSTATUS_DORMANT;
- for (size_t i = 0; i < thread->waiting_threads.size(); ++i) {
- const Handle waiting_thread = thread->waiting_threads[i];
+ for (Handle waiting_handle : thread->waiting_threads) {
+ Thread* waiting_thread = g_object_pool.Get<Thread>(waiting_handle);
if (VerifyWait(waiting_thread, WAITTYPE_THREADEND, handle)) {
- ResumeThreadFromWait(waiting_thread);
+ ResumeThreadFromWait(waiting_handle);
}
}
thread->waiting_threads.clear();
@@ -194,13 +189,13 @@ Handle ArbitrateHighestPriorityThread(u32 arbiter, u32 address) {
s32 priority = THREADPRIO_LOWEST;
// Iterate through threads, find highest priority thread that is waiting to be arbitrated...
- for (const auto& handle : thread_queue) {
+ for (Handle handle : thread_queue) {
+ Thread* thread = g_object_pool.Get<Thread>(handle);
// TODO(bunnei): Verify arbiter address...
- if (!VerifyWait(handle, WAITTYPE_ARB, arbiter))
+ if (!VerifyWait(thread, WAITTYPE_ARB, arbiter))
continue;
- Thread* thread = g_object_pool.Get<Thread>(handle);
if (thread == nullptr)
continue; // TODO(yuriks): Thread handle will hang around forever. Should clean up.
if(thread->current_priority <= priority) {
@@ -219,10 +214,11 @@ Handle ArbitrateHighestPriorityThread(u32 arbiter, u32 address) {
void ArbitrateAllThreads(u32 arbiter, u32 address) {
// Iterate through threads, find highest priority thread that is waiting to be arbitrated...
- for (const auto& handle : thread_queue) {
+ for (Handle handle : thread_queue) {
+ Thread* thread = g_object_pool.Get<Thread>(handle);
// TODO(bunnei): Verify arbiter address...
- if (VerifyWait(handle, WAITTYPE_ARB, arbiter))
+ if (VerifyWait(thread, WAITTYPE_ARB, arbiter))
ResumeThreadFromWait(handle);
}
}