diff options
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index fdc774e30..29e122dfd 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() { |
| @@ -703,6 +704,15 @@ struct KernelCore::Impl { | |||
| 703 | return port; | 704 | return port; |
| 704 | } | 705 | } |
| 705 | 706 | ||
| 707 | void RegisterNamedServiceHandler(std::string name, KServerPort* server_port) { | ||
| 708 | auto search = service_interface_handlers.find(name); | ||
| 709 | if (search == service_interface_handlers.end()) { | ||
| 710 | return; | ||
| 711 | } | ||
| 712 | |||
| 713 | search->second(system.ServiceManager(), server_port); | ||
| 714 | } | ||
| 715 | |||
| 706 | void RegisterServerObject(KAutoObject* server_object) { | 716 | void RegisterServerObject(KAutoObject* server_object) { |
| 707 | std::scoped_lock lk(server_objects_lock); | 717 | std::scoped_lock lk(server_objects_lock); |
| 708 | server_objects.insert(server_object); | 718 | server_objects.insert(server_object); |
| @@ -715,7 +725,7 @@ struct KernelCore::Impl { | |||
| 715 | 725 | ||
| 716 | std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel, | 726 | std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel, |
| 717 | const std::string& name) { | 727 | const std::string& name) { |
| 718 | auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, 1, name); | 728 | auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, name); |
| 719 | 729 | ||
| 720 | service_threads_manager.QueueWork( | 730 | service_threads_manager.QueueWork( |
| 721 | [this, service_thread]() { service_threads.emplace(service_thread); }); | 731 | [this, service_thread]() { service_threads.emplace(service_thread); }); |
| @@ -774,6 +784,7 @@ struct KernelCore::Impl { | |||
| 774 | /// Map of named ports managed by the kernel, which can be retrieved using | 784 | /// Map of named ports managed by the kernel, which can be retrieved using |
| 775 | /// the ConnectToPort SVC. | 785 | /// the ConnectToPort SVC. |
| 776 | std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory; | 786 | std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory; |
| 787 | std::unordered_map<std::string, ServiceInterfaceHandlerFn> service_interface_handlers; | ||
| 777 | NamedPortTable named_ports; | 788 | NamedPortTable named_ports; |
| 778 | std::unordered_set<KAutoObject*> server_objects; | 789 | std::unordered_set<KAutoObject*> server_objects; |
| 779 | std::unordered_set<KAutoObject*> registered_objects; | 790 | std::unordered_set<KAutoObject*> registered_objects; |
| @@ -981,10 +992,19 @@ void KernelCore::RegisterNamedService(std::string name, ServiceInterfaceFactory& | |||
| 981 | impl->service_interface_factory.emplace(std::move(name), factory); | 992 | impl->service_interface_factory.emplace(std::move(name), factory); |
| 982 | } | 993 | } |
| 983 | 994 | ||
| 995 | void KernelCore::RegisterInterfaceForNamedService(std::string name, | ||
| 996 | ServiceInterfaceHandlerFn&& handler) { | ||
| 997 | impl->service_interface_handlers.emplace(std::move(name), handler); | ||
| 998 | } | ||
| 999 | |||
| 984 | KClientPort* KernelCore::CreateNamedServicePort(std::string name) { | 1000 | KClientPort* KernelCore::CreateNamedServicePort(std::string name) { |
| 985 | return impl->CreateNamedServicePort(std::move(name)); | 1001 | return impl->CreateNamedServicePort(std::move(name)); |
| 986 | } | 1002 | } |
| 987 | 1003 | ||
| 1004 | void KernelCore::RegisterNamedServiceHandler(std::string name, KServerPort* server_port) { | ||
| 1005 | impl->RegisterNamedServiceHandler(std::move(name), server_port); | ||
| 1006 | } | ||
| 1007 | |||
| 988 | void KernelCore::RegisterServerObject(KAutoObject* server_object) { | 1008 | void KernelCore::RegisterServerObject(KAutoObject* server_object) { |
| 989 | impl->RegisterServerObject(server_object); | 1009 | impl->RegisterServerObject(server_object); |
| 990 | } | 1010 | } |