diff options
| author | 2022-11-03 21:45:56 -0700 | |
|---|---|---|
| committer | 2022-11-03 21:45:56 -0700 | |
| commit | 37de88040c1999fed639004fb7200cabb8a5f9c0 (patch) | |
| tree | 561f8439eb8cabd5f254701aaac05f728cdd1ade /src/core/hle/kernel/kernel.cpp | |
| parent | Merge pull request #9154 from liamwhite/new-fb (diff) | |
| parent | sm:: avoid excessive port recreation (diff) | |
| download | yuzu-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.cpp | 52 |
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 | ||
| 984 | KClientPort* KernelCore::CreateNamedServicePort(std::string name) { | 971 | void 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 | ||
| 988 | void KernelCore::RegisterServerObject(KAutoObject* server_object) { | 976 | KClientPort* KernelCore::CreateNamedServicePort(std::string name) { |
| 989 | impl->RegisterServerObject(server_object); | 977 | return impl->CreateNamedServicePort(std::move(name)); |
| 990 | } | 978 | } |
| 991 | 979 | ||
| 992 | void KernelCore::UnregisterServerObject(KAutoObject* server_object) { | 980 | void 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 | ||
| 996 | void KernelCore::RegisterKernelObject(KAutoObject* object) { | 984 | void KernelCore::RegisterKernelObject(KAutoObject* object) { |