summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2022-11-03 21:45:56 -0700
committerGravatar GitHub2022-11-03 21:45:56 -0700
commit37de88040c1999fed639004fb7200cabb8a5f9c0 (patch)
tree561f8439eb8cabd5f254701aaac05f728cdd1ade /src/core/hle/kernel/kernel.cpp
parentMerge pull request #9154 from liamwhite/new-fb (diff)
parentsm:: avoid excessive port recreation (diff)
downloadyuzu-37de88040c1999fed639004fb7200cabb8a5f9c0.tar.gz
yuzu-37de88040c1999fed639004fb7200cabb8a5f9c0.tar.xz
yuzu-37de88040c1999fed639004fb7200cabb8a5f9c0.zip
Merge pull request #9135 from liamwhite/service-thread-event
kernel: invert session request handling flow
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp52
1 files changed, 20 insertions, 32 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index fdc774e30..09c36ee09 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -60,7 +60,6 @@ struct KernelCore::Impl {
60 global_scheduler_context = std::make_unique<Kernel::GlobalSchedulerContext>(kernel); 60 global_scheduler_context = std::make_unique<Kernel::GlobalSchedulerContext>(kernel);
61 global_handle_table = std::make_unique<Kernel::KHandleTable>(kernel); 61 global_handle_table = std::make_unique<Kernel::KHandleTable>(kernel);
62 global_handle_table->Initialize(KHandleTable::MaxTableSize); 62 global_handle_table->Initialize(KHandleTable::MaxTableSize);
63 default_service_thread = CreateServiceThread(kernel, "DefaultServiceThread");
64 63
65 is_phantom_mode_for_singlecore = false; 64 is_phantom_mode_for_singlecore = false;
66 65
@@ -86,6 +85,8 @@ struct KernelCore::Impl {
86 } 85 }
87 86
88 RegisterHostThread(); 87 RegisterHostThread();
88
89 default_service_thread = CreateServiceThread(kernel, "DefaultServiceThread");
89 } 90 }
90 91
91 void InitializeCores() { 92 void InitializeCores() {
@@ -184,17 +185,6 @@ struct KernelCore::Impl {
184 } 185 }
185 186
186 void CloseServices() { 187 void CloseServices() {
187 // Close all open server sessions and ports.
188 std::unordered_set<KAutoObject*> server_objects_;
189 {
190 std::scoped_lock lk(server_objects_lock);
191 server_objects_ = server_objects;
192 server_objects.clear();
193 }
194 for (auto* server_object : server_objects_) {
195 server_object->Close();
196 }
197
198 // Ensures all service threads gracefully shutdown. 188 // Ensures all service threads gracefully shutdown.
199 ClearServiceThreads(); 189 ClearServiceThreads();
200 } 190 }
@@ -346,6 +336,8 @@ struct KernelCore::Impl {
346 return this_id; 336 return this_id;
347 } 337 }
348 338
339 static inline thread_local bool is_phantom_mode_for_singlecore{false};
340
349 bool IsPhantomModeForSingleCore() const { 341 bool IsPhantomModeForSingleCore() const {
350 return is_phantom_mode_for_singlecore; 342 return is_phantom_mode_for_singlecore;
351 } 343 }
@@ -698,24 +690,21 @@ struct KernelCore::Impl {
698 return {}; 690 return {};
699 } 691 }
700 692
701 KClientPort* port = &search->second(system.ServiceManager(), system); 693 return &search->second(system.ServiceManager(), system);
702 RegisterServerObject(&port->GetParent()->GetServerPort());
703 return port;
704 } 694 }
705 695
706 void RegisterServerObject(KAutoObject* server_object) { 696 void RegisterNamedServiceHandler(std::string name, KServerPort* server_port) {
707 std::scoped_lock lk(server_objects_lock); 697 auto search = service_interface_handlers.find(name);
708 server_objects.insert(server_object); 698 if (search == service_interface_handlers.end()) {
709 } 699 return;
700 }
710 701
711 void UnregisterServerObject(KAutoObject* server_object) { 702 search->second(system.ServiceManager(), server_port);
712 std::scoped_lock lk(server_objects_lock);
713 server_objects.erase(server_object);
714 } 703 }
715 704
716 std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel, 705 std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel,
717 const std::string& name) { 706 const std::string& name) {
718 auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, 1, name); 707 auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, name);
719 708
720 service_threads_manager.QueueWork( 709 service_threads_manager.QueueWork(
721 [this, service_thread]() { service_threads.emplace(service_thread); }); 710 [this, service_thread]() { service_threads.emplace(service_thread); });
@@ -745,7 +734,6 @@ struct KernelCore::Impl {
745 service_thread_barrier.Sync(); 734 service_thread_barrier.Sync();
746 } 735 }
747 736
748 std::mutex server_objects_lock;
749 std::mutex registered_objects_lock; 737 std::mutex registered_objects_lock;
750 std::mutex registered_in_use_objects_lock; 738 std::mutex registered_in_use_objects_lock;
751 739
@@ -774,8 +762,8 @@ struct KernelCore::Impl {
774 /// Map of named ports managed by the kernel, which can be retrieved using 762 /// Map of named ports managed by the kernel, which can be retrieved using
775 /// the ConnectToPort SVC. 763 /// the ConnectToPort SVC.
776 std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory; 764 std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory;
765 std::unordered_map<std::string, ServiceInterfaceHandlerFn> service_interface_handlers;
777 NamedPortTable named_ports; 766 NamedPortTable named_ports;
778 std::unordered_set<KAutoObject*> server_objects;
779 std::unordered_set<KAutoObject*> registered_objects; 767 std::unordered_set<KAutoObject*> registered_objects;
780 std::unordered_set<KAutoObject*> registered_in_use_objects; 768 std::unordered_set<KAutoObject*> registered_in_use_objects;
781 769
@@ -814,7 +802,6 @@ struct KernelCore::Impl {
814 802
815 bool is_multicore{}; 803 bool is_multicore{};
816 std::atomic_bool is_shutting_down{}; 804 std::atomic_bool is_shutting_down{};
817 bool is_phantom_mode_for_singlecore{};
818 u32 single_core_thread_id{}; 805 u32 single_core_thread_id{};
819 806
820 std::array<u64, Core::Hardware::NUM_CPU_CORES> svc_ticks{}; 807 std::array<u64, Core::Hardware::NUM_CPU_CORES> svc_ticks{};
@@ -981,16 +968,17 @@ void KernelCore::RegisterNamedService(std::string name, ServiceInterfaceFactory&
981 impl->service_interface_factory.emplace(std::move(name), factory); 968 impl->service_interface_factory.emplace(std::move(name), factory);
982} 969}
983 970
984KClientPort* KernelCore::CreateNamedServicePort(std::string name) { 971void KernelCore::RegisterInterfaceForNamedService(std::string name,
985 return impl->CreateNamedServicePort(std::move(name)); 972 ServiceInterfaceHandlerFn&& handler) {
973 impl->service_interface_handlers.emplace(std::move(name), handler);
986} 974}
987 975
988void KernelCore::RegisterServerObject(KAutoObject* server_object) { 976KClientPort* KernelCore::CreateNamedServicePort(std::string name) {
989 impl->RegisterServerObject(server_object); 977 return impl->CreateNamedServicePort(std::move(name));
990} 978}
991 979
992void KernelCore::UnregisterServerObject(KAutoObject* server_object) { 980void KernelCore::RegisterNamedServiceHandler(std::string name, KServerPort* server_port) {
993 impl->UnregisterServerObject(server_object); 981 impl->RegisterNamedServiceHandler(std::move(name), server_port);
994} 982}
995 983
996void KernelCore::RegisterKernelObject(KAutoObject* object) { 984void KernelCore::RegisterKernelObject(KAutoObject* object) {