diff options
| author | 2020-03-30 21:50:05 -0400 | |
|---|---|---|
| committer | 2020-06-27 11:36:03 -0400 | |
| commit | 19165cd859dcbb1f7d5e2c74c831e5196c2d1c41 (patch) | |
| tree | b8ce4801d50c76b77daae42d9ca9841a2ac82778 | |
| parent | SingleCore: Improve Cycle timing Behavior and replace mutex in global schedul... (diff) | |
| download | yuzu-19165cd859dcbb1f7d5e2c74c831e5196c2d1c41.tar.gz yuzu-19165cd859dcbb1f7d5e2c74c831e5196c2d1c41.tar.xz yuzu-19165cd859dcbb1f7d5e2c74c831e5196c2d1c41.zip | |
HLE_IPC: Correct HLE Event behavior on timeout.
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.h | 9 |
3 files changed, 19 insertions, 1 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index e74d91670..9277b5d08 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -70,6 +70,7 @@ std::shared_ptr<WritableEvent> HLERequestContext::SleepClientThread( | |||
| 70 | }); | 70 | }); |
| 71 | const auto readable_event{writable_event->GetReadableEvent()}; | 71 | const auto readable_event{writable_event->GetReadableEvent()}; |
| 72 | writable_event->Clear(); | 72 | writable_event->Clear(); |
| 73 | thread->SetHLESyncObject(readable_event.get()); | ||
| 73 | thread->SetStatus(ThreadStatus::WaitHLEEvent); | 74 | thread->SetStatus(ThreadStatus::WaitHLEEvent); |
| 74 | thread->SetSynchronizationResults(nullptr, RESULT_TIMEOUT); | 75 | thread->SetSynchronizationResults(nullptr, RESULT_TIMEOUT); |
| 75 | readable_event->AddWaitingThread(thread); | 76 | readable_event->AddWaitingThread(thread); |
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index c47fa9167..37e893c84 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -333,13 +333,21 @@ static ResultCode SendSyncRequest(Core::System& system, Handle handle) { | |||
| 333 | thread->SetStatus(ThreadStatus::WaitIPC); | 333 | thread->SetStatus(ThreadStatus::WaitIPC); |
| 334 | session->SendSyncRequest(SharedFrom(thread), system.Memory()); | 334 | session->SendSyncRequest(SharedFrom(thread), system.Memory()); |
| 335 | } | 335 | } |
| 336 | |||
| 336 | if (thread->HasHLECallback()) { | 337 | if (thread->HasHLECallback()) { |
| 337 | Handle event_handle = thread->GetHLETimeEvent(); | 338 | Handle event_handle = thread->GetHLETimeEvent(); |
| 338 | if (event_handle != InvalidHandle) { | 339 | if (event_handle != InvalidHandle) { |
| 339 | auto& time_manager = system.Kernel().TimeManager(); | 340 | auto& time_manager = system.Kernel().TimeManager(); |
| 340 | time_manager.UnscheduleTimeEvent(event_handle); | 341 | time_manager.UnscheduleTimeEvent(event_handle); |
| 341 | } | 342 | } |
| 342 | thread->InvokeHLECallback(SharedFrom(thread)); | 343 | |
| 344 | { | ||
| 345 | SchedulerLock lock(system.Kernel()); | ||
| 346 | auto* sync_object = thread->GetHLESyncObject(); | ||
| 347 | sync_object->RemoveWaitingThread(SharedFrom(thread)); | ||
| 348 | |||
| 349 | thread->InvokeHLECallback(SharedFrom(thread)); | ||
| 350 | } | ||
| 343 | } | 351 | } |
| 344 | 352 | ||
| 345 | return thread->GetSignalingResult(); | 353 | return thread->GetSignalingResult(); |
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h index f651d7822..61963148d 100644 --- a/src/core/hle/kernel/thread.h +++ b/src/core/hle/kernel/thread.h | |||
| @@ -489,10 +489,18 @@ public: | |||
| 489 | hle_time_event = time_event; | 489 | hle_time_event = time_event; |
| 490 | } | 490 | } |
| 491 | 491 | ||
| 492 | void SetHLESyncObject(SynchronizationObject* object) { | ||
| 493 | hle_object = object; | ||
| 494 | } | ||
| 495 | |||
| 492 | Handle GetHLETimeEvent() const { | 496 | Handle GetHLETimeEvent() const { |
| 493 | return hle_time_event; | 497 | return hle_time_event; |
| 494 | } | 498 | } |
| 495 | 499 | ||
| 500 | SynchronizationObject* GetHLESyncObject() const { | ||
| 501 | return hle_object; | ||
| 502 | } | ||
| 503 | |||
| 496 | void InvalidateWakeupCallback() { | 504 | void InvalidateWakeupCallback() { |
| 497 | SetWakeupCallback(nullptr); | 505 | SetWakeupCallback(nullptr); |
| 498 | } | 506 | } |
| @@ -698,6 +706,7 @@ private: | |||
| 698 | /// Callback for HLE Events | 706 | /// Callback for HLE Events |
| 699 | HLECallback hle_callback; | 707 | HLECallback hle_callback; |
| 700 | Handle hle_time_event; | 708 | Handle hle_time_event; |
| 709 | SynchronizationObject* hle_object; | ||
| 701 | 710 | ||
| 702 | Scheduler* scheduler = nullptr; | 711 | Scheduler* scheduler = nullptr; |
| 703 | 712 | ||