diff options
| author | liamwhite <liamwhite@users.noreply.github.com> | 2023-08-18 09:12:19 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-18 09:12:19 -0400 |
| commit | 314d3858a1cb6db72ef66ca41dd2cd9061cdbec4 (patch) | |
| tree | 0de70ba0585b5e3dc68cff10dfd330ce29bbab8e /src/core/hle/kernel/svc/svc_ipc.cpp | |
| parent | 0383ae1dbf815ed9b3a77bc31abca94ee72eb640 (diff) | |
| parent | 0bd9a4456c49b1e5de8f659682a814bb4b5854d2 (diff) | |
Merge pull request #11288 from liamwhite/svc-tick
kernel: remove relative task registration
Diffstat (limited to 'src/core/hle/kernel/svc/svc_ipc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc/svc_ipc.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/core/hle/kernel/svc/svc_ipc.cpp b/src/core/hle/kernel/svc/svc_ipc.cpp index 373ae7c8d..6b5e1cb8d 100644 --- a/src/core/hle/kernel/svc/svc_ipc.cpp +++ b/src/core/hle/kernel/svc/svc_ipc.cpp @@ -5,6 +5,7 @@ #include "common/scratch_buffer.h" #include "core/core.h" #include "core/hle/kernel/k_client_session.h" +#include "core/hle/kernel/k_hardware_timer.h" #include "core/hle/kernel/k_process.h" #include "core/hle/kernel/k_server_session.h" #include "core/hle/kernel/svc.h" @@ -82,12 +83,29 @@ Result ReplyAndReceive(Core::System& system, s32* out_index, uint64_t handles_ad R_TRY(session->SendReply()); } + // Convert the timeout from nanoseconds to ticks. + // NOTE: Nintendo does not use this conversion logic in WaitSynchronization... + s64 timeout; + if (timeout_ns > 0) { + const s64 offset_tick(timeout_ns); + if (offset_tick > 0) { + timeout = kernel.HardwareTimer().GetTick() + offset_tick + 2; + if (timeout <= 0) { + timeout = std::numeric_limits<s64>::max(); + } + } else { + timeout = std::numeric_limits<s64>::max(); + } + } else { + timeout = timeout_ns; + } + // Wait for a message. while (true) { // Wait for an object. s32 index; Result result = KSynchronizationObject::Wait(kernel, std::addressof(index), objs.data(), - num_handles, timeout_ns); + num_handles, timeout); if (result == ResultTimedOut) { R_RETURN(result); } |
