diff options
| author | 2020-03-08 12:51:24 -0400 | |
|---|---|---|
| committer | 2020-06-27 11:35:40 -0400 | |
| commit | 6515c6e8c699584528486341579cf3a8dde3eea4 (patch) | |
| tree | 1663248cbd02cc0db108ed18feef5a994e44d63d /src/core/hle/kernel/synchronization.cpp | |
| parent | Scheduler: Correct yields. (diff) | |
| download | yuzu-6515c6e8c699584528486341579cf3a8dde3eea4.tar.gz yuzu-6515c6e8c699584528486341579cf3a8dde3eea4.tar.xz yuzu-6515c6e8c699584528486341579cf3a8dde3eea4.zip | |
Kernel: Fixes, corrections and asserts to scheduler and different svcs.
Diffstat (limited to 'src/core/hle/kernel/synchronization.cpp')
| -rw-r--r-- | src/core/hle/kernel/synchronization.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/core/hle/kernel/synchronization.cpp b/src/core/hle/kernel/synchronization.cpp index 4323fc120..275bf11cc 100644 --- a/src/core/hle/kernel/synchronization.cpp +++ b/src/core/hle/kernel/synchronization.cpp | |||
| @@ -23,9 +23,10 @@ void Synchronization::SignalObject(SynchronizationObject& obj) const { | |||
| 23 | if (obj.IsSignaled()) { | 23 | if (obj.IsSignaled()) { |
| 24 | for (auto thread : obj.GetWaitingThreads()) { | 24 | for (auto thread : obj.GetWaitingThreads()) { |
| 25 | if (thread->GetSchedulingStatus() == ThreadSchedStatus::Paused) { | 25 | if (thread->GetSchedulingStatus() == ThreadSchedStatus::Paused) { |
| 26 | ASSERT(thread->GetStatus() == ThreadStatus::WaitSynch); | ||
| 27 | ASSERT(thread->IsWaitingSync()); | ||
| 26 | thread->SetSynchronizationResults(&obj, RESULT_SUCCESS); | 28 | thread->SetSynchronizationResults(&obj, RESULT_SUCCESS); |
| 27 | thread->ResumeFromWait(); | 29 | thread->ResumeFromWait(); |
| 28 | time_manager.CancelTimeEvent(thread.get()); | ||
| 29 | } | 30 | } |
| 30 | } | 31 | } |
| 31 | obj.ClearWaitingThreads(); | 32 | obj.ClearWaitingThreads(); |
| @@ -91,10 +92,11 @@ std::pair<ResultCode, Handle> Synchronization::WaitFor( | |||
| 91 | ResultCode signaling_result = thread->GetSignalingResult(); | 92 | ResultCode signaling_result = thread->GetSignalingResult(); |
| 92 | SynchronizationObject* signaling_object = thread->GetSignalingObject(); | 93 | SynchronizationObject* signaling_object = thread->GetSignalingObject(); |
| 93 | thread->SetSynchronizationObjects(nullptr); | 94 | thread->SetSynchronizationObjects(nullptr); |
| 95 | auto shared_thread = SharedFrom(thread); | ||
| 94 | for (auto& obj : sync_objects) { | 96 | for (auto& obj : sync_objects) { |
| 95 | obj->RemoveWaitingThread(SharedFrom(thread)); | 97 | obj->RemoveWaitingThread(shared_thread); |
| 96 | } | 98 | } |
| 97 | if (signaling_result == RESULT_SUCCESS) { | 99 | if (signaling_object != nullptr) { |
| 98 | const auto itr = std::find_if( | 100 | const auto itr = std::find_if( |
| 99 | sync_objects.begin(), sync_objects.end(), | 101 | sync_objects.begin(), sync_objects.end(), |
| 100 | [signaling_object](const std::shared_ptr<SynchronizationObject>& object) { | 102 | [signaling_object](const std::shared_ptr<SynchronizationObject>& object) { |
| @@ -103,7 +105,7 @@ std::pair<ResultCode, Handle> Synchronization::WaitFor( | |||
| 103 | ASSERT(itr != sync_objects.end()); | 105 | ASSERT(itr != sync_objects.end()); |
| 104 | signaling_object->Acquire(thread); | 106 | signaling_object->Acquire(thread); |
| 105 | const u32 index = static_cast<s32>(std::distance(sync_objects.begin(), itr)); | 107 | const u32 index = static_cast<s32>(std::distance(sync_objects.begin(), itr)); |
| 106 | return {RESULT_SUCCESS, index}; | 108 | return {signaling_result, index}; |
| 107 | } | 109 | } |
| 108 | return {signaling_result, -1}; | 110 | return {signaling_result, -1}; |
| 109 | } | 111 | } |