diff options
| author | 2021-12-12 22:43:25 -0800 | |
|---|---|---|
| committer | 2021-12-12 22:43:25 -0800 | |
| commit | 280c77989880e81f622440b157a0ce1b7139847b (patch) | |
| tree | 49a3ef8127d721dc44effb8315e5db7e796336f4 /src/core/hle/kernel/svc.cpp | |
| parent | Merge pull request #7495 from FernandoS27/text-blit-fix-again (diff) | |
| parent | hle: kernel k_scheduler: EnableScheduling: Remove redundant GetCurrentThreadP... (diff) | |
| download | yuzu-280c77989880e81f622440b157a0ce1b7139847b.tar.gz yuzu-280c77989880e81f622440b157a0ce1b7139847b.tar.xz yuzu-280c77989880e81f622440b157a0ce1b7139847b.zip | |
Merge pull request #7462 from bunnei/kernel-improve-scheduling
Kernel: Improve threading & scheduling V3
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index b37db918e..a9f7438ea 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include "core/hle/kernel/k_shared_memory.h" | 32 | #include "core/hle/kernel/k_shared_memory.h" |
| 33 | #include "core/hle/kernel/k_synchronization_object.h" | 33 | #include "core/hle/kernel/k_synchronization_object.h" |
| 34 | #include "core/hle/kernel/k_thread.h" | 34 | #include "core/hle/kernel/k_thread.h" |
| 35 | #include "core/hle/kernel/k_thread_queue.h" | ||
| 35 | #include "core/hle/kernel/k_transfer_memory.h" | 36 | #include "core/hle/kernel/k_transfer_memory.h" |
| 36 | #include "core/hle/kernel/k_writable_event.h" | 37 | #include "core/hle/kernel/k_writable_event.h" |
| 37 | #include "core/hle/kernel/kernel.h" | 38 | #include "core/hle/kernel/kernel.h" |
| @@ -308,26 +309,29 @@ static ResultCode ConnectToNamedPort32(Core::System& system, Handle* out_handle, | |||
| 308 | 309 | ||
| 309 | /// Makes a blocking IPC call to an OS service. | 310 | /// Makes a blocking IPC call to an OS service. |
| 310 | static ResultCode SendSyncRequest(Core::System& system, Handle handle) { | 311 | static ResultCode SendSyncRequest(Core::System& system, Handle handle) { |
| 311 | |||
| 312 | auto& kernel = system.Kernel(); | 312 | auto& kernel = system.Kernel(); |
| 313 | 313 | ||
| 314 | // Create the wait queue. | ||
| 315 | KThreadQueue wait_queue(kernel); | ||
| 316 | |||
| 317 | // Get the client session from its handle. | ||
| 318 | KScopedAutoObject session = | ||
| 319 | kernel.CurrentProcess()->GetHandleTable().GetObject<KClientSession>(handle); | ||
| 320 | R_UNLESS(session.IsNotNull(), ResultInvalidHandle); | ||
| 321 | |||
| 322 | LOG_TRACE(Kernel_SVC, "called handle=0x{:08X}({})", handle, session->GetName()); | ||
| 323 | |||
| 314 | auto thread = kernel.CurrentScheduler()->GetCurrentThread(); | 324 | auto thread = kernel.CurrentScheduler()->GetCurrentThread(); |
| 315 | { | 325 | { |
| 316 | KScopedSchedulerLock lock(kernel); | 326 | KScopedSchedulerLock lock(kernel); |
| 317 | thread->SetState(ThreadState::Waiting); | 327 | |
| 318 | thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::IPC); | 328 | // This is a synchronous request, so we should wait for our request to complete. |
| 319 | 329 | GetCurrentThread(kernel).BeginWait(std::addressof(wait_queue)); | |
| 320 | { | 330 | GetCurrentThread(kernel).SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::IPC); |
| 321 | KScopedAutoObject session = | 331 | session->SendSyncRequest(&GetCurrentThread(kernel), system.Memory(), system.CoreTiming()); |
| 322 | kernel.CurrentProcess()->GetHandleTable().GetObject<KClientSession>(handle); | ||
| 323 | R_UNLESS(session.IsNotNull(), ResultInvalidHandle); | ||
| 324 | LOG_TRACE(Kernel_SVC, "called handle=0x{:08X}({})", handle, session->GetName()); | ||
| 325 | session->SendSyncRequest(thread, system.Memory(), system.CoreTiming()); | ||
| 326 | } | ||
| 327 | } | 332 | } |
| 328 | 333 | ||
| 329 | KSynchronizationObject* dummy{}; | 334 | return thread->GetWaitResult(); |
| 330 | return thread->GetWaitResult(std::addressof(dummy)); | ||
| 331 | } | 335 | } |
| 332 | 336 | ||
| 333 | static ResultCode SendSyncRequest32(Core::System& system, Handle handle) { | 337 | static ResultCode SendSyncRequest32(Core::System& system, Handle handle) { |
| @@ -874,7 +878,7 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, Handle | |||
| 874 | const u64 thread_ticks = current_thread->GetCpuTime(); | 878 | const u64 thread_ticks = current_thread->GetCpuTime(); |
| 875 | 879 | ||
| 876 | out_ticks = thread_ticks + (core_timing.GetCPUTicks() - prev_ctx_ticks); | 880 | out_ticks = thread_ticks + (core_timing.GetCPUTicks() - prev_ctx_ticks); |
| 877 | } else if (same_thread && info_sub_id == system.CurrentCoreIndex()) { | 881 | } else if (same_thread && info_sub_id == system.Kernel().CurrentPhysicalCoreIndex()) { |
| 878 | out_ticks = core_timing.GetCPUTicks() - prev_ctx_ticks; | 882 | out_ticks = core_timing.GetCPUTicks() - prev_ctx_ticks; |
| 879 | } | 883 | } |
| 880 | 884 | ||
| @@ -888,7 +892,8 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, Handle | |||
| 888 | return ResultInvalidHandle; | 892 | return ResultInvalidHandle; |
| 889 | } | 893 | } |
| 890 | 894 | ||
| 891 | if (info_sub_id != 0xFFFFFFFFFFFFFFFF && info_sub_id != system.CurrentCoreIndex()) { | 895 | if (info_sub_id != 0xFFFFFFFFFFFFFFFF && |
| 896 | info_sub_id != system.Kernel().CurrentPhysicalCoreIndex()) { | ||
| 892 | LOG_ERROR(Kernel_SVC, "Core is not the current core, got {}", info_sub_id); | 897 | LOG_ERROR(Kernel_SVC, "Core is not the current core, got {}", info_sub_id); |
| 893 | return ResultInvalidCombination; | 898 | return ResultInvalidCombination; |
| 894 | } | 899 | } |