diff options
| author | 2022-11-06 19:43:38 -0500 | |
|---|---|---|
| committer | 2022-11-06 19:50:51 -0500 | |
| commit | 6a0d8b2aa154921e8328dfab9450510ad8e1b5c8 (patch) | |
| tree | 58c88d7ca923789c9a5d5518d2af1e413887f451 /src/core/hle/kernel/kernel.cpp | |
| parent | Merge pull request #9195 from vonchenplus/vmm_kinds_error (diff) | |
| download | yuzu-6a0d8b2aa154921e8328dfab9450510ad8e1b5c8.tar.gz yuzu-6a0d8b2aa154921e8328dfab9450510ad8e1b5c8.tar.xz yuzu-6a0d8b2aa154921e8328dfab9450510ad8e1b5c8.zip | |
service_thread: fix deletion
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 47b760a9c..abff14079 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -93,7 +93,7 @@ struct KernelCore::Impl { | |||
| 93 | 93 | ||
| 94 | RegisterHostThread(); | 94 | RegisterHostThread(); |
| 95 | 95 | ||
| 96 | default_service_thread = CreateServiceThread(kernel, "DefaultServiceThread"); | 96 | default_service_thread = &CreateServiceThread(kernel, "DefaultServiceThread"); |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | void InitializeCores() { | 99 | void InitializeCores() { |
| @@ -779,33 +779,31 @@ struct KernelCore::Impl { | |||
| 779 | search->second(system.ServiceManager(), server_port); | 779 | search->second(system.ServiceManager(), server_port); |
| 780 | } | 780 | } |
| 781 | 781 | ||
| 782 | std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel, | 782 | Kernel::ServiceThread& CreateServiceThread(KernelCore& kernel, const std::string& name) { |
| 783 | const std::string& name) { | 783 | auto* ptr = new ServiceThread(kernel, name); |
| 784 | auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, name); | ||
| 785 | 784 | ||
| 786 | service_threads_manager.QueueWork( | 785 | service_threads_manager.QueueWork( |
| 787 | [this, service_thread]() { service_threads.emplace(service_thread); }); | 786 | [this, ptr]() { service_threads.emplace(ptr, std::unique_ptr<ServiceThread>(ptr)); }); |
| 788 | 787 | ||
| 789 | return service_thread; | 788 | return *ptr; |
| 790 | } | 789 | } |
| 791 | 790 | ||
| 792 | void ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) { | 791 | void ReleaseServiceThread(Kernel::ServiceThread& service_thread) { |
| 793 | if (auto strong_ptr = service_thread.lock()) { | 792 | auto* ptr = &service_thread; |
| 794 | if (strong_ptr == default_service_thread.lock()) { | ||
| 795 | // Nothing to do here, the service is using default_service_thread, which will be | ||
| 796 | // released on shutdown. | ||
| 797 | return; | ||
| 798 | } | ||
| 799 | 793 | ||
| 800 | service_threads_manager.QueueWork( | 794 | if (ptr == default_service_thread) { |
| 801 | [this, strong_ptr{std::move(strong_ptr)}]() { service_threads.erase(strong_ptr); }); | 795 | // Nothing to do here, the service is using default_service_thread, which will be |
| 796 | // released on shutdown. | ||
| 797 | return; | ||
| 802 | } | 798 | } |
| 799 | |||
| 800 | service_threads_manager.QueueWork([this, ptr]() { service_threads.erase(ptr); }); | ||
| 803 | } | 801 | } |
| 804 | 802 | ||
| 805 | void ClearServiceThreads() { | 803 | void ClearServiceThreads() { |
| 806 | service_threads_manager.QueueWork([this] { | 804 | service_threads_manager.QueueWork([this] { |
| 807 | service_threads.clear(); | 805 | service_threads.clear(); |
| 808 | default_service_thread.reset(); | 806 | default_service_thread = nullptr; |
| 809 | service_thread_barrier.Sync(); | 807 | service_thread_barrier.Sync(); |
| 810 | }); | 808 | }); |
| 811 | service_thread_barrier.Sync(); | 809 | service_thread_barrier.Sync(); |
| @@ -881,8 +879,8 @@ struct KernelCore::Impl { | |||
| 881 | std::unique_ptr<KMemoryLayout> memory_layout; | 879 | std::unique_ptr<KMemoryLayout> memory_layout; |
| 882 | 880 | ||
| 883 | // Threads used for services | 881 | // Threads used for services |
| 884 | std::unordered_set<std::shared_ptr<ServiceThread>> service_threads; | 882 | std::unordered_map<ServiceThread*, std::unique_ptr<ServiceThread>> service_threads; |
| 885 | std::weak_ptr<ServiceThread> default_service_thread; | 883 | ServiceThread* default_service_thread{}; |
| 886 | Common::ThreadWorker service_threads_manager; | 884 | Common::ThreadWorker service_threads_manager; |
| 887 | Common::Barrier service_thread_barrier; | 885 | Common::Barrier service_thread_barrier; |
| 888 | 886 | ||
| @@ -1239,15 +1237,15 @@ void KernelCore::ExitSVCProfile() { | |||
| 1239 | MicroProfileLeave(MICROPROFILE_TOKEN(Kernel_SVC), impl->svc_ticks[CurrentPhysicalCoreIndex()]); | 1237 | MicroProfileLeave(MICROPROFILE_TOKEN(Kernel_SVC), impl->svc_ticks[CurrentPhysicalCoreIndex()]); |
| 1240 | } | 1238 | } |
| 1241 | 1239 | ||
| 1242 | std::weak_ptr<Kernel::ServiceThread> KernelCore::CreateServiceThread(const std::string& name) { | 1240 | Kernel::ServiceThread& KernelCore::CreateServiceThread(const std::string& name) { |
| 1243 | return impl->CreateServiceThread(*this, name); | 1241 | return impl->CreateServiceThread(*this, name); |
| 1244 | } | 1242 | } |
| 1245 | 1243 | ||
| 1246 | std::weak_ptr<Kernel::ServiceThread> KernelCore::GetDefaultServiceThread() const { | 1244 | Kernel::ServiceThread& KernelCore::GetDefaultServiceThread() const { |
| 1247 | return impl->default_service_thread; | 1245 | return *impl->default_service_thread; |
| 1248 | } | 1246 | } |
| 1249 | 1247 | ||
| 1250 | void KernelCore::ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) { | 1248 | void KernelCore::ReleaseServiceThread(Kernel::ServiceThread& service_thread) { |
| 1251 | impl->ReleaseServiceThread(service_thread); | 1249 | impl->ReleaseServiceThread(service_thread); |
| 1252 | } | 1250 | } |
| 1253 | 1251 | ||