summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp42
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
1242std::weak_ptr<Kernel::ServiceThread> KernelCore::CreateServiceThread(const std::string& name) { 1240Kernel::ServiceThread& KernelCore::CreateServiceThread(const std::string& name) {
1243 return impl->CreateServiceThread(*this, name); 1241 return impl->CreateServiceThread(*this, name);
1244} 1242}
1245 1243
1246std::weak_ptr<Kernel::ServiceThread> KernelCore::GetDefaultServiceThread() const { 1244Kernel::ServiceThread& KernelCore::GetDefaultServiceThread() const {
1247 return impl->default_service_thread; 1245 return *impl->default_service_thread;
1248} 1246}
1249 1247
1250void KernelCore::ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) { 1248void KernelCore::ReleaseServiceThread(Kernel::ServiceThread& service_thread) {
1251 impl->ReleaseServiceThread(service_thread); 1249 impl->ReleaseServiceThread(service_thread);
1252} 1250}
1253 1251