diff options
author | Sebastian Valle <subv2112@gmail.com> | 2017-09-30 16:12:18 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-30 16:12:18 +0200 |
commit | db752b52e84227696af989c2ec1965020c03fac7 (patch) | |
tree | 04f1e6403bede1890252a0af047e2e149abdde4c /src/core/hle/kernel/thread.cpp | |
parent | Merge pull request #2962 from huwpascoe/static_cast (diff) | |
parent | Kernel/Threads: When putting a thread to wait, specify a function to execute when it is awoken. (diff) | |
download | yuzu-db752b52e84227696af989c2ec1965020c03fac7.tar yuzu-db752b52e84227696af989c2ec1965020c03fac7.tar.gz yuzu-db752b52e84227696af989c2ec1965020c03fac7.tar.bz2 yuzu-db752b52e84227696af989c2ec1965020c03fac7.tar.lz yuzu-db752b52e84227696af989c2ec1965020c03fac7.tar.xz yuzu-db752b52e84227696af989c2ec1965020c03fac7.tar.zst yuzu-db752b52e84227696af989c2ec1965020c03fac7.zip |
Diffstat (limited to 'src/core/hle/kernel/thread.cpp')
-rw-r--r-- | src/core/hle/kernel/thread.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 11f7d2127..2614a260c 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp @@ -247,12 +247,15 @@ static void ThreadWakeupCallback(u64 thread_handle, int cycles_late) { if (thread->status == THREADSTATUS_WAIT_SYNCH_ANY || thread->status == THREADSTATUS_WAIT_SYNCH_ALL || thread->status == THREADSTATUS_WAIT_ARB) { - thread->wait_set_output = false; + + // Invoke the wakeup callback before clearing the wait objects + if (thread->wakeup_callback) + thread->wakeup_callback(ThreadWakeupReason::Timeout, thread, nullptr); + // Remove the thread from each of its waiting objects' waitlists for (auto& object : thread->wait_objects) object->RemoveWaitingThread(thread.get()); thread->wait_objects.clear(); - thread->SetWaitSynchronizationResult(RESULT_TIMEOUT); } thread->ResumeFromWait(); @@ -278,6 +281,9 @@ void Thread::ResumeFromWait() { break; case THREADSTATUS_READY: + // The thread's wakeup callback must have already been cleared when the thread was first + // awoken. + ASSERT(wakeup_callback == nullptr); // If the thread is waiting on multiple wait objects, it might be awoken more than once // before actually resuming. We can ignore subsequent wakeups if the thread status has // already been set to THREADSTATUS_READY. @@ -293,6 +299,8 @@ void Thread::ResumeFromWait() { return; } + wakeup_callback = nullptr; + ready_queue.push_back(current_priority, this); status = THREADSTATUS_READY; Core::System::GetInstance().PrepareReschedule(); @@ -395,7 +403,6 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, thread->nominal_priority = thread->current_priority = priority; thread->last_running_ticks = CoreTiming::GetTicks(); thread->processor_id = processor_id; - thread->wait_set_output = false; thread->wait_objects.clear(); thread->wait_address = 0; thread->name = std::move(name); |