diff options
| author | 2021-06-08 16:43:55 -0700 | |
|---|---|---|
| committer | 2021-06-08 16:43:55 -0700 | |
| commit | 3c621d37f0477046b489ab809f4b4a563f982510 (patch) | |
| tree | c6d6c48fc36d18990edd3fe70b8621e70c1c6cbb /src/core/hle/kernel/kernel.cpp | |
| parent | Merge pull request #6426 from lat9nq/context-menu-start (diff) | |
| parent | hle: kernel: KServerSession: Work-around scenario where session is closed too... (diff) | |
| download | yuzu-3c621d37f0477046b489ab809f4b4a563f982510.tar.gz yuzu-3c621d37f0477046b489ab809f4b4a563f982510.tar.xz yuzu-3c621d37f0477046b489ab809f4b4a563f982510.zip | |
Merge pull request #6428 from bunnei/service-thread-crash-fix
hle: kernel: Remove service thread manager and use weak_ptr.
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() { |