summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
-rw-r--r--src/core/hle/kernel/svc.cpp13
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