diff options
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
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 | ||