service: Migrate global named port map to the KernelCore class
Now that we have a class representing the kernel in some capacity, we now have a place to put the named port map, so we move it over and get rid of another piece of global state within the core.
This commit is contained in:
parent
325f3e0693
commit
1242c1ec0a
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/core_timing.h"
|
#include "core/core_timing.h"
|
||||||
|
#include "core/hle/kernel/client_port.h"
|
||||||
#include "core/hle/kernel/handle_table.h"
|
#include "core/hle/kernel/handle_table.h"
|
||||||
#include "core/hle/kernel/kernel.h"
|
#include "core/hle/kernel/kernel.h"
|
||||||
#include "core/hle/kernel/process.h"
|
#include "core/hle/kernel/process.h"
|
||||||
|
@ -124,6 +125,8 @@ struct KernelCore::Impl {
|
||||||
|
|
||||||
timer_callback_handle_table.Clear();
|
timer_callback_handle_table.Clear();
|
||||||
timer_callback_event_type = nullptr;
|
timer_callback_event_type = nullptr;
|
||||||
|
|
||||||
|
named_ports.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitializeResourceLimits(KernelCore& kernel) {
|
void InitializeResourceLimits(KernelCore& kernel) {
|
||||||
|
@ -217,6 +220,10 @@ struct KernelCore::Impl {
|
||||||
// TODO(yuriks): This can be removed if Thread objects are explicitly pooled in the future,
|
// TODO(yuriks): This can be removed if Thread objects are explicitly pooled in the future,
|
||||||
// allowing us to simply use a pool index or similar.
|
// allowing us to simply use a pool index or similar.
|
||||||
Kernel::HandleTable thread_wakeup_callback_handle_table;
|
Kernel::HandleTable thread_wakeup_callback_handle_table;
|
||||||
|
|
||||||
|
/// Map of named ports managed by the kernel, which can be retrieved using
|
||||||
|
/// the ConnectToPort SVC.
|
||||||
|
NamedPortTable named_ports;
|
||||||
};
|
};
|
||||||
|
|
||||||
KernelCore::KernelCore() : impl{std::make_unique<Impl>()} {}
|
KernelCore::KernelCore() : impl{std::make_unique<Impl>()} {}
|
||||||
|
@ -257,6 +264,23 @@ void KernelCore::AppendNewProcess(SharedPtr<Process> process) {
|
||||||
impl->process_list.push_back(std::move(process));
|
impl->process_list.push_back(std::move(process));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KernelCore::AddNamedPort(std::string name, SharedPtr<ClientPort> port) {
|
||||||
|
impl->named_ports.emplace(std::move(name), std::move(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const {
|
||||||
|
return port != impl->named_ports.cend();
|
||||||
|
}
|
||||||
|
|
||||||
u32 KernelCore::CreateNewObjectID() {
|
u32 KernelCore::CreateNewObjectID() {
|
||||||
return impl->next_object_id++;
|
return impl->next_object_id++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
#include "core/hle/kernel/object.h"
|
#include "core/hle/kernel/object.h"
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -15,6 +17,7 @@ struct EventType;
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
|
class ClientPort;
|
||||||
class HandleTable;
|
class HandleTable;
|
||||||
class Process;
|
class Process;
|
||||||
class ResourceLimit;
|
class ResourceLimit;
|
||||||
|
@ -25,6 +28,9 @@ enum class ResourceLimitCategory : u8;
|
||||||
|
|
||||||
/// Represents a single instance of the kernel.
|
/// Represents a single instance of the kernel.
|
||||||
class KernelCore {
|
class KernelCore {
|
||||||
|
private:
|
||||||
|
using NamedPortTable = std::unordered_map<std::string, SharedPtr<ClientPort>>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
KernelCore();
|
KernelCore();
|
||||||
~KernelCore();
|
~KernelCore();
|
||||||
|
@ -59,6 +65,18 @@ public:
|
||||||
/// Adds the given shared pointer to an internal list of active processes.
|
/// Adds the given shared pointer to an internal list of active processes.
|
||||||
void AppendNewProcess(SharedPtr<Process> process);
|
void AppendNewProcess(SharedPtr<Process> process);
|
||||||
|
|
||||||
|
/// Adds a port to the named port table
|
||||||
|
void AddNamedPort(std::string name, SharedPtr<ClientPort> port);
|
||||||
|
|
||||||
|
/// Finds a port within the named port table with the given name.
|
||||||
|
NamedPortTable::iterator FindNamedPort(const std::string& name);
|
||||||
|
|
||||||
|
/// Finds a port within the named port table with the given name.
|
||||||
|
NamedPortTable::const_iterator FindNamedPort(const std::string& name) const;
|
||||||
|
|
||||||
|
/// Determines whether or not the given port is a valid named port.
|
||||||
|
bool IsValidNamedPort(NamedPortTable::const_iterator port) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class Object;
|
friend class Object;
|
||||||
friend class Process;
|
friend class Process;
|
||||||
|
|
|
@ -68,19 +68,22 @@ static ResultCode UnmapMemory(VAddr dst_addr, VAddr src_addr, u64 size) {
|
||||||
|
|
||||||
/// Connect to an OS service given the port name, returns the handle to the port to out
|
/// Connect to an OS service given the port name, returns the handle to the port to out
|
||||||
static ResultCode ConnectToNamedPort(Handle* out_handle, VAddr port_name_address) {
|
static ResultCode ConnectToNamedPort(Handle* out_handle, VAddr port_name_address) {
|
||||||
if (!Memory::IsValidVirtualAddress(port_name_address))
|
if (!Memory::IsValidVirtualAddress(port_name_address)) {
|
||||||
return ERR_NOT_FOUND;
|
return ERR_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
static constexpr std::size_t PortNameMaxLength = 11;
|
static constexpr std::size_t PortNameMaxLength = 11;
|
||||||
// Read 1 char beyond the max allowed port name to detect names that are too long.
|
// Read 1 char beyond the max allowed port name to detect names that are too long.
|
||||||
std::string port_name = Memory::ReadCString(port_name_address, PortNameMaxLength + 1);
|
std::string port_name = Memory::ReadCString(port_name_address, PortNameMaxLength + 1);
|
||||||
if (port_name.size() > PortNameMaxLength)
|
if (port_name.size() > PortNameMaxLength) {
|
||||||
return ERR_PORT_NAME_TOO_LONG;
|
return ERR_PORT_NAME_TOO_LONG;
|
||||||
|
}
|
||||||
|
|
||||||
LOG_TRACE(Kernel_SVC, "called port_name={}", port_name);
|
LOG_TRACE(Kernel_SVC, "called port_name={}", port_name);
|
||||||
|
|
||||||
auto it = Service::g_kernel_named_ports.find(port_name);
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
if (it == Service::g_kernel_named_ports.end()) {
|
auto it = kernel.FindNamedPort(port_name);
|
||||||
|
if (!kernel.IsValidNamedPort(it)) {
|
||||||
LOG_WARNING(Kernel_SVC, "tried to connect to unknown port: {}", port_name);
|
LOG_WARNING(Kernel_SVC, "tried to connect to unknown port: {}", port_name);
|
||||||
return ERR_NOT_FOUND;
|
return ERR_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
@ -91,7 +94,6 @@ static ResultCode ConnectToNamedPort(Handle* out_handle, VAddr port_name_address
|
||||||
CASCADE_RESULT(client_session, client_port->Connect());
|
CASCADE_RESULT(client_session, client_port->Connect());
|
||||||
|
|
||||||
// Return the client session
|
// Return the client session
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
|
||||||
CASCADE_RESULT(*out_handle, kernel.HandleTable().Create(client_session));
|
CASCADE_RESULT(*out_handle, kernel.HandleTable().Create(client_session));
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "core/hle/ipc_helpers.h"
|
#include "core/hle/ipc_helpers.h"
|
||||||
#include "core/hle/kernel/client_port.h"
|
#include "core/hle/kernel/client_port.h"
|
||||||
#include "core/hle/kernel/handle_table.h"
|
#include "core/hle/kernel/handle_table.h"
|
||||||
|
#include "core/hle/kernel/kernel.h"
|
||||||
#include "core/hle/kernel/process.h"
|
#include "core/hle/kernel/process.h"
|
||||||
#include "core/hle/kernel/server_port.h"
|
#include "core/hle/kernel/server_port.h"
|
||||||
#include "core/hle/kernel/thread.h"
|
#include "core/hle/kernel/thread.h"
|
||||||
|
@ -114,7 +115,7 @@ void ServiceFrameworkBase::InstallAsNamedPort() {
|
||||||
std::tie(server_port, client_port) =
|
std::tie(server_port, client_port) =
|
||||||
ServerPort::CreatePortPair(kernel, max_sessions, service_name);
|
ServerPort::CreatePortPair(kernel, max_sessions, service_name);
|
||||||
server_port->SetHleHandler(shared_from_this());
|
server_port->SetHleHandler(shared_from_this());
|
||||||
AddNamedPort(service_name, std::move(client_port));
|
kernel.AddNamedPort(service_name, std::move(client_port));
|
||||||
}
|
}
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::ClientPort> ServiceFrameworkBase::CreatePort() {
|
Kernel::SharedPtr<Kernel::ClientPort> ServiceFrameworkBase::CreatePort() {
|
||||||
|
@ -197,11 +198,6 @@ ResultCode ServiceFrameworkBase::HandleSyncRequest(Kernel::HLERequestContext& co
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Module interface
|
// Module interface
|
||||||
|
|
||||||
// TODO(yuriks): Move to kernel
|
|
||||||
void AddNamedPort(std::string name, SharedPtr<ClientPort> port) {
|
|
||||||
g_kernel_named_ports.emplace(std::move(name), std::move(port));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Initialize ServiceManager
|
/// Initialize ServiceManager
|
||||||
void Init(std::shared_ptr<SM::ServiceManager>& sm, const FileSys::VirtualFilesystem& rfs) {
|
void Init(std::shared_ptr<SM::ServiceManager>& sm, const FileSys::VirtualFilesystem& rfs) {
|
||||||
// NVFlinger needs to be accessed by several services like Vi and AppletOE so we instantiate it
|
// NVFlinger needs to be accessed by several services like Vi and AppletOE so we instantiate it
|
||||||
|
@ -264,7 +260,6 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm, const FileSys::VirtualFilesys
|
||||||
|
|
||||||
/// Shutdown ServiceManager
|
/// Shutdown ServiceManager
|
||||||
void Shutdown() {
|
void Shutdown() {
|
||||||
g_kernel_named_ports.clear();
|
|
||||||
LOG_DEBUG(Service, "shutdown OK");
|
LOG_DEBUG(Service, "shutdown OK");
|
||||||
}
|
}
|
||||||
} // namespace Service
|
} // namespace Service
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
|
||||||
#include <boost/container/flat_map.hpp>
|
#include <boost/container/flat_map.hpp>
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "core/hle/kernel/hle_ipc.h"
|
#include "core/hle/kernel/hle_ipc.h"
|
||||||
|
@ -187,10 +186,4 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm,
|
||||||
/// Shutdown ServiceManager
|
/// Shutdown ServiceManager
|
||||||
void Shutdown();
|
void Shutdown();
|
||||||
|
|
||||||
/// Map of named ports managed by the kernel, which can be retrieved using the ConnectToPort SVC.
|
|
||||||
extern std::unordered_map<std::string, Kernel::SharedPtr<Kernel::ClientPort>> g_kernel_named_ports;
|
|
||||||
|
|
||||||
/// Adds a port to the named port table
|
|
||||||
void AddNamedPort(std::string name, Kernel::SharedPtr<Kernel::ClientPort> port);
|
|
||||||
|
|
||||||
} // namespace Service
|
} // namespace Service
|
||||||
|
|
Reference in New Issue