diff options
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 18 |
1 files changed, 4 insertions, 14 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 0ffb78d51..2ceeaeb5f 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -63,8 +63,6 @@ struct KernelCore::Impl { | |||
| 63 | global_scheduler_context = std::make_unique<Kernel::GlobalSchedulerContext>(kernel); | 63 | global_scheduler_context = std::make_unique<Kernel::GlobalSchedulerContext>(kernel); |
| 64 | global_handle_table = std::make_unique<Kernel::KHandleTable>(kernel); | 64 | global_handle_table = std::make_unique<Kernel::KHandleTable>(kernel); |
| 65 | 65 | ||
| 66 | service_thread_manager = | ||
| 67 | std::make_unique<Common::ThreadWorker>(1, "yuzu:ServiceThreadManager"); | ||
| 68 | is_phantom_mode_for_singlecore = false; | 66 | is_phantom_mode_for_singlecore = false; |
| 69 | 67 | ||
| 70 | InitializePhysicalCores(); | 68 | InitializePhysicalCores(); |
| @@ -96,7 +94,6 @@ struct KernelCore::Impl { | |||
| 96 | process_list.clear(); | 94 | process_list.clear(); |
| 97 | 95 | ||
| 98 | // Ensures all service threads gracefully shutdown | 96 | // Ensures all service threads gracefully shutdown |
| 99 | service_thread_manager.reset(); | ||
| 100 | service_threads.clear(); | 97 | service_threads.clear(); |
| 101 | 98 | ||
| 102 | next_object_id = 0; | 99 | next_object_id = 0; |
| @@ -680,10 +677,6 @@ struct KernelCore::Impl { | |||
| 680 | // Threads used for services | 677 | // Threads used for services |
| 681 | std::unordered_set<std::shared_ptr<Kernel::ServiceThread>> service_threads; | 678 | std::unordered_set<std::shared_ptr<Kernel::ServiceThread>> service_threads; |
| 682 | 679 | ||
| 683 | // Service threads are managed by a worker thread, so that a calling service thread can queue up | ||
| 684 | // the release of itself | ||
| 685 | std::unique_ptr<Common::ThreadWorker> service_thread_manager; | ||
| 686 | |||
| 687 | std::array<KThread*, Core::Hardware::NUM_CPU_CORES> suspend_threads; | 680 | std::array<KThread*, Core::Hardware::NUM_CPU_CORES> suspend_threads; |
| 688 | std::array<Core::CPUInterruptHandler, Core::Hardware::NUM_CPU_CORES> interrupts{}; | 681 | std::array<Core::CPUInterruptHandler, Core::Hardware::NUM_CPU_CORES> interrupts{}; |
| 689 | std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{}; | 682 | std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{}; |
| @@ -986,17 +979,14 @@ void KernelCore::ExitSVCProfile() { | |||
| 986 | 979 | ||
| 987 | std::weak_ptr<Kernel::ServiceThread> KernelCore::CreateServiceThread(const std::string& name) { | 980 | std::weak_ptr<Kernel::ServiceThread> KernelCore::CreateServiceThread(const std::string& name) { |
| 988 | auto service_thread = std::make_shared<Kernel::ServiceThread>(*this, 1, name); | 981 | auto service_thread = std::make_shared<Kernel::ServiceThread>(*this, 1, name); |
| 989 | impl->service_thread_manager->QueueWork( | 982 | impl->service_threads.emplace(service_thread); |
| 990 | [this, service_thread] { impl->service_threads.emplace(service_thread); }); | ||
| 991 | return service_thread; | 983 | return service_thread; |
| 992 | } | 984 | } |
| 993 | 985 | ||
| 994 | void KernelCore::ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) { | 986 | void KernelCore::ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) { |
| 995 | impl->service_thread_manager->QueueWork([this, service_thread] { | 987 | if (auto strong_ptr = service_thread.lock()) { |
| 996 | if (auto strong_ptr = service_thread.lock()) { | 988 | impl->service_threads.erase(strong_ptr); |
| 997 | impl->service_threads.erase(strong_ptr); | 989 | } |
| 998 | } | ||
| 999 | }); | ||
| 1000 | } | 990 | } |
| 1001 | 991 | ||
| 1002 | Init::KSlabResourceCounts& KernelCore::SlabResourceCounts() { | 992 | Init::KSlabResourceCounts& KernelCore::SlabResourceCounts() { |