diff options
| author | 2020-02-26 22:26:53 -0400 | |
|---|---|---|
| committer | 2020-06-27 11:35:17 -0400 | |
| commit | d4ebb510a05d29befde6556e632413e5b35b9ab5 (patch) | |
| tree | 309755a4ef21b48f12cca6c40798dccd191cf860 /src/core/hle/kernel/synchronization.cpp | |
| parent | SVC: Cleanup old methods. (diff) | |
| download | yuzu-d4ebb510a05d29befde6556e632413e5b35b9ab5.tar.gz yuzu-d4ebb510a05d29befde6556e632413e5b35b9ab5.tar.xz yuzu-d4ebb510a05d29befde6556e632413e5b35b9ab5.zip | |
SVC: Correct WaitSynchronization, WaitProcessWideKey, SignalProcessWideKey.
Diffstat (limited to 'src/core/hle/kernel/synchronization.cpp')
| -rw-r--r-- | src/core/hle/kernel/synchronization.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/core/hle/kernel/synchronization.cpp b/src/core/hle/kernel/synchronization.cpp index b36e550a0..c60c5bb42 100644 --- a/src/core/hle/kernel/synchronization.cpp +++ b/src/core/hle/kernel/synchronization.cpp | |||
| @@ -17,12 +17,15 @@ namespace Kernel { | |||
| 17 | Synchronization::Synchronization(Core::System& system) : system{system} {} | 17 | Synchronization::Synchronization(Core::System& system) : system{system} {} |
| 18 | 18 | ||
| 19 | void Synchronization::SignalObject(SynchronizationObject& obj) const { | 19 | void Synchronization::SignalObject(SynchronizationObject& obj) const { |
| 20 | SchedulerLock lock(system.Kernel()); | 20 | auto& kernel = system.Kernel(); |
| 21 | SchedulerLock lock(kernel); | ||
| 22 | auto& time_manager = kernel.TimeManager(); | ||
| 21 | if (obj.IsSignaled()) { | 23 | if (obj.IsSignaled()) { |
| 22 | for (auto thread : obj.GetWaitingThreads()) { | 24 | for (auto thread : obj.GetWaitingThreads()) { |
| 23 | if (thread->GetSchedulingStatus() == ThreadSchedStatus::Paused) { | 25 | if (thread->GetSchedulingStatus() == ThreadSchedStatus::Paused) { |
| 24 | thread->SetSynchronizationResults(&obj, RESULT_SUCCESS); | 26 | thread->SetSynchronizationResults(&obj, RESULT_SUCCESS); |
| 25 | thread->ResumeFromWait(); | 27 | thread->ResumeFromWait(); |
| 28 | time_manager.CancelTimeEvent(thread.get()); | ||
| 26 | } | 29 | } |
| 27 | } | 30 | } |
| 28 | } | 31 | } |
| @@ -79,6 +82,9 @@ std::pair<ResultCode, Handle> Synchronization::WaitFor( | |||
| 79 | SchedulerLock lock(kernel); | 82 | SchedulerLock lock(kernel); |
| 80 | ResultCode signaling_result = thread->GetSignalingResult(); | 83 | ResultCode signaling_result = thread->GetSignalingResult(); |
| 81 | SynchronizationObject* signaling_object = thread->GetSignalingObject(); | 84 | SynchronizationObject* signaling_object = thread->GetSignalingObject(); |
| 85 | for (auto& obj : sync_objects) { | ||
| 86 | obj->RemoveWaitingThread(SharedFrom(thread)); | ||
| 87 | } | ||
| 82 | if (signaling_result == RESULT_SUCCESS) { | 88 | if (signaling_result == RESULT_SUCCESS) { |
| 83 | const auto itr = std::find_if( | 89 | const auto itr = std::find_if( |
| 84 | sync_objects.begin(), sync_objects.end(), | 90 | sync_objects.begin(), sync_objects.end(), |