|
|
@@ -44,6 +44,7 @@
|
|
|
#include "core/hle/kernel/time_manager.h"
|
|
|
#include "core/hle/lock.h"
|
|
|
#include "core/hle/result.h"
|
|
|
+#include "core/hle/service/sm/sm.h"
|
|
|
#include "core/memory.h"
|
|
|
|
|
|
MICROPROFILE_DEFINE(Kernel_SVC, "Kernel", "SVC", MP_RGB(70, 200, 70));
|
|
|
@@ -656,6 +657,7 @@ struct KernelCore::Impl {
|
|
|
|
|
|
/// Map of named ports managed by the kernel, which can be retrieved using
|
|
|
/// the ConnectToPort SVC.
|
|
|
+ std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory;
|
|
|
NamedPortTable named_ports;
|
|
|
|
|
|
std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor;
|
|
|
@@ -844,18 +846,17 @@ void KernelCore::PrepareReschedule(std::size_t id) {
|
|
|
// TODO: Reimplement, this
|
|
|
}
|
|
|
|
|
|
-void KernelCore::AddNamedPort(std::string name, KClientPort* port) {
|
|
|
- port->Open();
|
|
|
- impl->named_ports.emplace(std::move(name), port);
|
|
|
+void KernelCore::RegisterNamedService(std::string name, ServiceInterfaceFactory&& factory) {
|
|
|
+ impl->service_interface_factory.emplace(std::move(name), factory);
|
|
|
}
|
|
|
|
|
|
-KernelCore::NamedPortTable::iterator KernelCore::FindNamedPort(const std::string& name) {
|
|
|
- return impl->named_ports.find(name);
|
|
|
-}
|
|
|
-
|
|
|
-KernelCore::NamedPortTable::const_iterator KernelCore::FindNamedPort(
|
|
|
- const std::string& name) const {
|
|
|
- return impl->named_ports.find(name);
|
|
|
+KClientPort* KernelCore::CreateNamedServicePort(std::string name) {
|
|
|
+ auto search = impl->service_interface_factory.find(name);
|
|
|
+ if (search == impl->service_interface_factory.end()) {
|
|
|
+ UNIMPLEMENTED();
|
|
|
+ return {};
|
|
|
+ }
|
|
|
+ return &search->second(impl->system.ServiceManager(), impl->system);
|
|
|
}
|
|
|
|
|
|
bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const {
|