summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/synchronization.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/synchronization.cpp')
-rw-r--r--src/core/hle/kernel/synchronization.cpp8
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 {
17Synchronization::Synchronization(Core::System& system) : system{system} {} 17Synchronization::Synchronization(Core::System& system) : system{system} {}
18 18
19void Synchronization::SignalObject(SynchronizationObject& obj) const { 19void 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(),