summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/kernel/k_server_session.cpp3
-rw-r--r--src/core/hle/kernel/svc.cpp13
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