Kernel: pass ref to session pair
This commit is contained in:
parent
1213a298df
commit
13c26b4371
18 changed files with 71 additions and 48 deletions
|
@ -13,7 +13,7 @@
|
|||
|
||||
namespace Kernel {
|
||||
|
||||
ClientPort::ClientPort(KernelSystem& kernel) {}
|
||||
ClientPort::ClientPort(KernelSystem& kernel) : kernel(kernel) {}
|
||||
ClientPort::~ClientPort() = default;
|
||||
|
||||
ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() {
|
||||
|
@ -26,7 +26,7 @@ ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() {
|
|||
active_sessions++;
|
||||
|
||||
// Create a new session pair, let the created sessions inherit the parent port's HLE handler.
|
||||
auto sessions = ServerSession::CreateSessionPair(server_port->GetName(), this);
|
||||
auto sessions = kernel.CreateSessionPair(server_port->GetName(), this);
|
||||
|
||||
if (server_port->hle_handler)
|
||||
server_port->hle_handler->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions));
|
||||
|
|
|
@ -51,6 +51,7 @@ private:
|
|||
explicit ClientPort(KernelSystem& kernel);
|
||||
~ClientPort() override;
|
||||
|
||||
KernelSystem& kernel;
|
||||
SharedPtr<ServerPort> server_port; ///< ServerPort associated with this client port.
|
||||
u32 max_sessions = 0; ///< Maximum number of simultaneous sessions the port can have
|
||||
u32 active_sessions = 0; ///< Number of currently open sessions to this port
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
namespace Kernel {
|
||||
|
||||
ClientSession::ClientSession() = default;
|
||||
ClientSession::ClientSession(KernelSystem& kernel) {}
|
||||
ClientSession::~ClientSession() {
|
||||
// This destructor will be called automatically when the last ClientSession handle is closed by
|
||||
// the emulated application.
|
||||
|
|
|
@ -12,13 +12,12 @@
|
|||
|
||||
namespace Kernel {
|
||||
|
||||
class ServerSession;
|
||||
class Session;
|
||||
class Thread;
|
||||
|
||||
class ClientSession final : public Object {
|
||||
public:
|
||||
friend class ServerSession;
|
||||
friend class KernelSystem;
|
||||
|
||||
std::string GetTypeName() const override {
|
||||
return "ClientSession";
|
||||
|
@ -46,7 +45,7 @@ public:
|
|||
std::shared_ptr<Session> parent;
|
||||
|
||||
private:
|
||||
ClientSession();
|
||||
explicit ClientSession(KernelSystem& kernel);
|
||||
~ClientSession() override;
|
||||
};
|
||||
|
||||
|
|
|
@ -21,6 +21,8 @@ class Semaphore;
|
|||
class Timer;
|
||||
class ClientPort;
|
||||
class ServerPort;
|
||||
class ClientSession;
|
||||
class ServerSession;
|
||||
|
||||
enum class ResetType {
|
||||
OneShot,
|
||||
|
@ -105,6 +107,15 @@ public:
|
|||
*/
|
||||
std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair(
|
||||
u32 max_sessions, std::string name = "UnknownPort");
|
||||
|
||||
/**
|
||||
* Creates a pair of ServerSession and an associated ClientSession.
|
||||
* @param name Optional name of the ports.
|
||||
* @param client_port Optional The ClientPort that spawned this session.
|
||||
* @return The created session tuple
|
||||
*/
|
||||
std::tuple<SharedPtr<ServerSession>, SharedPtr<ClientSession>> CreateSessionPair(
|
||||
const std::string& name = "Unknown", SharedPtr<ClientPort> client_port = nullptr);
|
||||
};
|
||||
|
||||
} // namespace Kernel
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
namespace Kernel {
|
||||
|
||||
ServerSession::ServerSession() = default;
|
||||
ServerSession::ServerSession(KernelSystem& kernel) {}
|
||||
ServerSession::~ServerSession() {
|
||||
// This destructor will be called automatically when the last ServerSession handle is closed by
|
||||
// the emulated application.
|
||||
|
@ -28,8 +28,8 @@ ServerSession::~ServerSession() {
|
|||
parent->server = nullptr;
|
||||
}
|
||||
|
||||
ResultVal<SharedPtr<ServerSession>> ServerSession::Create(std::string name) {
|
||||
SharedPtr<ServerSession> server_session(new ServerSession);
|
||||
ResultVal<SharedPtr<ServerSession>> ServerSession::Create(KernelSystem& kernel, std::string name) {
|
||||
SharedPtr<ServerSession> server_session(new ServerSession(kernel));
|
||||
|
||||
server_session->name = std::move(name);
|
||||
server_session->parent = nullptr;
|
||||
|
@ -100,10 +100,10 @@ ResultCode ServerSession::HandleSyncRequest(SharedPtr<Thread> thread) {
|
|||
return RESULT_SUCCESS;
|
||||
}
|
||||
|
||||
ServerSession::SessionPair ServerSession::CreateSessionPair(const std::string& name,
|
||||
SharedPtr<ClientPort> port) {
|
||||
auto server_session = ServerSession::Create(name + "_Server").Unwrap();
|
||||
SharedPtr<ClientSession> client_session(new ClientSession);
|
||||
std::tuple<SharedPtr<ServerSession>, SharedPtr<ClientSession>> KernelSystem::CreateSessionPair(
|
||||
const std::string& name, SharedPtr<ClientPort> port) {
|
||||
auto server_session = ServerSession::Create(*this, name + "_Server").Unwrap();
|
||||
SharedPtr<ClientSession> client_session(new ClientSession(*this));
|
||||
client_session->name = name + "_Client";
|
||||
|
||||
std::shared_ptr<Session> parent(new Session);
|
||||
|
|
|
@ -48,17 +48,6 @@ public:
|
|||
return HANDLE_TYPE;
|
||||
}
|
||||
|
||||
using SessionPair = std::tuple<SharedPtr<ServerSession>, SharedPtr<ClientSession>>;
|
||||
|
||||
/**
|
||||
* Creates a pair of ServerSession and an associated ClientSession.
|
||||
* @param name Optional name of the ports.
|
||||
* @param client_port Optional The ClientPort that spawned this session.
|
||||
* @return The created session tuple
|
||||
*/
|
||||
static SessionPair CreateSessionPair(const std::string& name = "Unknown",
|
||||
SharedPtr<ClientPort> client_port = nullptr);
|
||||
|
||||
/**
|
||||
* Sets the HLE handler for the session. This handler will be called to service IPC requests
|
||||
* instead of the regular IPC machinery. (The regular IPC machinery is currently not
|
||||
|
@ -95,16 +84,20 @@ public:
|
|||
SharedPtr<Thread> currently_handling;
|
||||
|
||||
private:
|
||||
ServerSession();
|
||||
explicit ServerSession(KernelSystem& kernel);
|
||||
~ServerSession() override;
|
||||
|
||||
/**
|
||||
* Creates a server session. The server session can have an optional HLE handler,
|
||||
* which will be invoked to handle the IPC requests that this session receives.
|
||||
* @param kernel The kernel instance to create the server session on
|
||||
* @param name Optional name of the server session.
|
||||
* @return The created server session
|
||||
*/
|
||||
static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown");
|
||||
static ResultVal<SharedPtr<ServerSession>> Create(KernelSystem& kernel,
|
||||
std::string name = "Unknown");
|
||||
|
||||
friend class KernelSystem;
|
||||
};
|
||||
|
||||
} // namespace Kernel
|
||||
|
|
|
@ -1142,7 +1142,7 @@ static ResultCode CreateSessionToPort(Handle* out_client_session, Handle client_
|
|||
}
|
||||
|
||||
static ResultCode CreateSession(Handle* server_session, Handle* client_session) {
|
||||
auto sessions = ServerSession::CreateSessionPair();
|
||||
auto sessions = Core::System::GetInstance().Kernel().CreateSessionPair();
|
||||
|
||||
auto& server = std::get<SharedPtr<ServerSession>>(sessions);
|
||||
CASCADE_RESULT(*server_session, g_handle_table.Create(std::move(server)));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue