diff options
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 312c64c17..5f917686f 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | #include <functional> | 8 | #include <functional> |
| 9 | #include <memory> | 9 | #include <memory> |
| 10 | #include <thread> | 10 | #include <thread> |
| 11 | #include <unordered_map> | 11 | #include <unordered_set> |
| 12 | #include <utility> | 12 | #include <utility> |
| 13 | 13 | ||
| 14 | #include "common/assert.h" | 14 | #include "common/assert.h" |
| @@ -35,6 +35,7 @@ | |||
| 35 | #include "core/hle/kernel/physical_core.h" | 35 | #include "core/hle/kernel/physical_core.h" |
| 36 | #include "core/hle/kernel/process.h" | 36 | #include "core/hle/kernel/process.h" |
| 37 | #include "core/hle/kernel/resource_limit.h" | 37 | #include "core/hle/kernel/resource_limit.h" |
| 38 | #include "core/hle/kernel/service_thread.h" | ||
| 38 | #include "core/hle/kernel/shared_memory.h" | 39 | #include "core/hle/kernel/shared_memory.h" |
| 39 | #include "core/hle/kernel/synchronization.h" | 40 | #include "core/hle/kernel/synchronization.h" |
| 40 | #include "core/hle/kernel/thread.h" | 41 | #include "core/hle/kernel/thread.h" |
| @@ -107,6 +108,9 @@ struct KernelCore::Impl { | |||
| 107 | std::fill(register_host_thread_keys.begin(), register_host_thread_keys.end(), | 108 | std::fill(register_host_thread_keys.begin(), register_host_thread_keys.end(), |
| 108 | std::thread::id{}); | 109 | std::thread::id{}); |
| 109 | std::fill(register_host_thread_values.begin(), register_host_thread_values.end(), 0); | 110 | std::fill(register_host_thread_values.begin(), register_host_thread_values.end(), 0); |
| 111 | |||
| 112 | // Ensures all service threads gracefully shutdown | ||
| 113 | service_threads.clear(); | ||
| 110 | } | 114 | } |
| 111 | 115 | ||
| 112 | void InitializePhysicalCores() { | 116 | void InitializePhysicalCores() { |
| @@ -345,6 +349,9 @@ struct KernelCore::Impl { | |||
| 345 | std::shared_ptr<Kernel::SharedMemory> irs_shared_mem; | 349 | std::shared_ptr<Kernel::SharedMemory> irs_shared_mem; |
| 346 | std::shared_ptr<Kernel::SharedMemory> time_shared_mem; | 350 | std::shared_ptr<Kernel::SharedMemory> time_shared_mem; |
| 347 | 351 | ||
| 352 | // Threads used for services | ||
| 353 | std::unordered_set<std::shared_ptr<Kernel::ServiceThread>> service_threads; | ||
| 354 | |||
| 348 | std::array<std::shared_ptr<Thread>, Core::Hardware::NUM_CPU_CORES> suspend_threads{}; | 355 | std::array<std::shared_ptr<Thread>, Core::Hardware::NUM_CPU_CORES> suspend_threads{}; |
| 349 | std::array<Core::CPUInterruptHandler, Core::Hardware::NUM_CPU_CORES> interrupts{}; | 356 | std::array<Core::CPUInterruptHandler, Core::Hardware::NUM_CPU_CORES> interrupts{}; |
| 350 | std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{}; | 357 | std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{}; |
| @@ -639,4 +646,16 @@ void KernelCore::ExitSVCProfile() { | |||
| 639 | MicroProfileLeave(MICROPROFILE_TOKEN(Kernel_SVC), impl->svc_ticks[core]); | 646 | MicroProfileLeave(MICROPROFILE_TOKEN(Kernel_SVC), impl->svc_ticks[core]); |
| 640 | } | 647 | } |
| 641 | 648 | ||
| 649 | std::weak_ptr<Kernel::ServiceThread> KernelCore::CreateServiceThread(const std::string& name) { | ||
| 650 | auto service_thread = std::make_shared<Kernel::ServiceThread>(*this, 1, name); | ||
| 651 | impl->service_threads.emplace(service_thread); | ||
| 652 | return service_thread; | ||
| 653 | } | ||
| 654 | |||
| 655 | void KernelCore::ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) { | ||
| 656 | if (auto strong_ptr = service_thread.lock()) { | ||
| 657 | impl->service_threads.erase(strong_ptr); | ||
| 658 | } | ||
| 659 | } | ||
| 660 | |||
| 642 | } // namespace Kernel | 661 | } // namespace Kernel |