summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/synchronization.cpp
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-03-08 12:51:24 -0400
committerGravatar Fernando Sahmkow2020-06-27 11:35:40 -0400
commit6515c6e8c699584528486341579cf3a8dde3eea4 (patch)
tree1663248cbd02cc0db108ed18feef5a994e44d63d /src/core/hle/kernel/synchronization.cpp
parentScheduler: Correct yields. (diff)
downloadyuzu-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.cpp10
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 }