Kernel/IPC: Use Ports and Sessions as the fundamental building block of Inter Process Communication.
All handles obtained via srv::GetServiceHandle or svcConnectToPort are references to ClientSessions. Service modules will wait on the counterpart of those ClientSessions (Called ServerSessions) using svcReplyAndReceive or svcWaitSynchronization[1|N], and will be awoken when a SyncRequest is performed. HLE Interfaces are now ClientPorts which override the HandleSyncRequest virtual member function to perform command handling immediately.
This commit is contained in:
parent
68c00ee771
commit
073653e858
16 changed files with 315 additions and 89 deletions
|
@ -9,7 +9,8 @@
|
|||
#include <unordered_map>
|
||||
#include <boost/container/flat_map.hpp>
|
||||
#include "common/common_types.h"
|
||||
#include "core/hle/kernel/session.h"
|
||||
#include "core/hle/kernel/client_port.h"
|
||||
#include "core/hle/kernel/server_session.h"
|
||||
#include "core/hle/result.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -18,9 +19,10 @@
|
|||
namespace Service {
|
||||
|
||||
static const int kMaxPortSize = 8; ///< Maximum size of a port name (8 characters)
|
||||
static const u32 DefaultMaxSessions = 10; ///< Arbitrary default number of maximum connections to an HLE port
|
||||
|
||||
/// Interface to a CTROS service
|
||||
class Interface : public Kernel::Session {
|
||||
class Interface : public Kernel::ClientPort {
|
||||
// TODO(yuriks): An "Interface" being a Kernel::Object is mostly non-sense. Interface should be
|
||||
// just something that encapsulates a session and acts as a helper to implement service
|
||||
// processes.
|
||||
|
@ -33,6 +35,15 @@ public:
|
|||
version.raw = raw_version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the maximum allowed number of sessions that can be connected to this port at the same time.
|
||||
* It should be overwritten by each service implementation for more fine-grained control.
|
||||
* @returns The maximum number of connections allowed.
|
||||
*/
|
||||
virtual u32 GetMaxSessions() { return DefaultMaxSessions; }
|
||||
|
||||
void AddWaitingSession(Kernel::SharedPtr<Kernel::ServerSession> server_session) override { }
|
||||
|
||||
typedef void (*Function)(Interface*);
|
||||
|
||||
struct FunctionInfo {
|
||||
|
@ -49,7 +60,7 @@ public:
|
|||
return "[UNKNOWN SERVICE PORT]";
|
||||
}
|
||||
|
||||
ResultVal<bool> SyncRequest() override;
|
||||
ResultCode HandleSyncRequest() override;
|
||||
|
||||
protected:
|
||||
/**
|
||||
|
@ -81,9 +92,9 @@ void Init();
|
|||
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<Interface>> g_kernel_named_ports;
|
||||
extern std::unordered_map<std::string, Kernel::SharedPtr<Kernel::ClientPort>> g_kernel_named_ports;
|
||||
/// Map of services registered with the "srv:" service, retrieved using GetServiceHandle.
|
||||
extern std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_srv_services;
|
||||
extern std::unordered_map<std::string, Kernel::SharedPtr<Kernel::ClientPort>> g_srv_services;
|
||||
|
||||
/// Adds a service to the services table
|
||||
void AddService(Interface* interface_);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue