diff options
| -rw-r--r-- | src/core/hle/kernel/k_server_session.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 13 |
2 files changed, 11 insertions, 5 deletions
diff --git a/src/core/hle/kernel/k_server_session.cpp b/src/core/hle/kernel/k_server_session.cpp index 1f7220d48..d4e4a6b06 100644 --- a/src/core/hle/kernel/k_server_session.cpp +++ b/src/core/hle/kernel/k_server_session.cpp | |||
| @@ -175,8 +175,7 @@ ResultCode KServerSession::CompleteSyncRequest(HLERequestContext& context) { | |||
| 175 | { | 175 | { |
| 176 | KScopedSchedulerLock lock(kernel); | 176 | KScopedSchedulerLock lock(kernel); |
| 177 | if (!context.IsThreadWaiting()) { | 177 | if (!context.IsThreadWaiting()) { |
| 178 | context.GetThread().Wakeup(); | 178 | context.GetThread().EndWait(result); |
| 179 | context.GetThread().SetWaitResult(result); | ||
| 180 | } | 179 | } |
| 181 | } | 180 | } |
| 182 | 181 | ||
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 50c6e513d..0e79e1be3 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include "core/hle/kernel/k_shared_memory.h" | 31 | #include "core/hle/kernel/k_shared_memory.h" |
| 32 | #include "core/hle/kernel/k_synchronization_object.h" | 32 | #include "core/hle/kernel/k_synchronization_object.h" |
| 33 | #include "core/hle/kernel/k_thread.h" | 33 | #include "core/hle/kernel/k_thread.h" |
| 34 | #include "core/hle/kernel/k_thread_queue.h" | ||
| 34 | #include "core/hle/kernel/k_transfer_memory.h" | 35 | #include "core/hle/kernel/k_transfer_memory.h" |
| 35 | #include "core/hle/kernel/k_writable_event.h" | 36 | #include "core/hle/kernel/k_writable_event.h" |
| 36 | #include "core/hle/kernel/kernel.h" | 37 | #include "core/hle/kernel/kernel.h" |
| @@ -310,18 +311,24 @@ static ResultCode SendSyncRequest(Core::System& system, Handle handle) { | |||
| 310 | 311 | ||
| 311 | auto& kernel = system.Kernel(); | 312 | auto& kernel = system.Kernel(); |
| 312 | 313 | ||
| 314 | // Create the wait queue. | ||
| 315 | KThreadQueue wait_queue(kernel); | ||
| 316 | |||
| 313 | auto thread = kernel.CurrentScheduler()->GetCurrentThread(); | 317 | auto thread = kernel.CurrentScheduler()->GetCurrentThread(); |
| 314 | { | 318 | { |
| 315 | KScopedSchedulerLock lock(kernel); | 319 | KScopedSchedulerLock lock(kernel); |
| 316 | thread->SetState(ThreadState::Waiting); | 320 | |
| 317 | thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::IPC); | 321 | // This is a synchronous request, so we should wait for our request to complete. |
| 322 | GetCurrentThread(kernel).BeginWait(std::addressof(wait_queue)); | ||
| 323 | GetCurrentThread(kernel).SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::IPC); | ||
| 318 | 324 | ||
| 319 | { | 325 | { |
| 320 | KScopedAutoObject session = | 326 | KScopedAutoObject session = |
| 321 | kernel.CurrentProcess()->GetHandleTable().GetObject<KClientSession>(handle); | 327 | kernel.CurrentProcess()->GetHandleTable().GetObject<KClientSession>(handle); |
| 322 | R_UNLESS(session.IsNotNull(), ResultInvalidHandle); | 328 | R_UNLESS(session.IsNotNull(), ResultInvalidHandle); |
| 323 | LOG_TRACE(Kernel_SVC, "called handle=0x{:08X}({})", handle, session->GetName()); | 329 | LOG_TRACE(Kernel_SVC, "called handle=0x{:08X}({})", handle, session->GetName()); |
| 324 | session->SendSyncRequest(thread, system.Memory(), system.CoreTiming()); | 330 | session->SendSyncRequest(&GetCurrentThread(kernel), system.Memory(), |
| 331 | system.CoreTiming()); | ||
| 325 | } | 332 | } |
| 326 | } | 333 | } |
| 327 | 334 | ||