diff options
| author | 2016-12-05 11:02:08 -0500 | |
|---|---|---|
| committer | 2016-12-05 11:02:08 -0500 | |
| commit | dd8887c8cfbb6d3010dde240278a3d4018c5dd85 (patch) | |
| tree | 9990a463d5daccdab41ae9c90a5c698aed0d4795 /src/core/hle/kernel | |
| parent | Declare empty ServerSession and ClientSession constructors as default. (diff) | |
| download | yuzu-dd8887c8cfbb6d3010dde240278a3d4018c5dd85.tar.gz yuzu-dd8887c8cfbb6d3010dde240278a3d4018c5dd85.tar.xz yuzu-dd8887c8cfbb6d3010dde240278a3d4018c5dd85.zip | |
KServerPorts now have an HLE handler "template", which is inherited by all ServerSessions created from it.
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/client_port.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/kernel/client_port.h | 10 | ||||
| -rw-r--r-- | src/core/hle/kernel/client_session.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/client_session.h | 21 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_port.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_port.h | 13 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_session.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_session.h | 30 |
8 files changed, 60 insertions, 35 deletions
diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp index 5ee7679eb..f25cb48dd 100644 --- a/src/core/hle/kernel/client_port.cpp +++ b/src/core/hle/kernel/client_port.cpp | |||
| @@ -13,10 +13,18 @@ namespace Kernel { | |||
| 13 | ClientPort::ClientPort() {} | 13 | ClientPort::ClientPort() {} |
| 14 | ClientPort::~ClientPort() {} | 14 | ClientPort::~ClientPort() {} |
| 15 | 15 | ||
| 16 | void ClientPort::AddWaitingSession(SharedPtr<ServerSession> server_session) { | 16 | SharedPtr<ClientSession> ClientPort::Connect() { |
| 17 | // Create a new session pair, let the created sessions inherit the parent port's HLE handler. | ||
| 18 | auto sessions = ServerSession::CreateSessionPair(server_port->GetName(), server_port->hle_handler); | ||
| 19 | auto client_session = std::get<SharedPtr<ClientSession>>(sessions); | ||
| 20 | auto server_session = std::get<SharedPtr<ServerSession>>(sessions); | ||
| 21 | |||
| 17 | server_port->pending_sessions.push_back(server_session); | 22 | server_port->pending_sessions.push_back(server_session); |
| 23 | |||
| 18 | // Wake the threads waiting on the ServerPort | 24 | // Wake the threads waiting on the ServerPort |
| 19 | server_port->WakeupAllWaitingThreads(); | 25 | server_port->WakeupAllWaitingThreads(); |
| 26 | |||
| 27 | return std::move(client_session); | ||
| 20 | } | 28 | } |
| 21 | 29 | ||
| 22 | } // namespace | 30 | } // namespace |
diff --git a/src/core/hle/kernel/client_port.h b/src/core/hle/kernel/client_port.h index 4848cb4c4..d217c6649 100644 --- a/src/core/hle/kernel/client_port.h +++ b/src/core/hle/kernel/client_port.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | namespace Kernel { | 11 | namespace Kernel { |
| 12 | 12 | ||
| 13 | class ServerPort; | 13 | class ServerPort; |
| 14 | class ServerSession; | 14 | class ClientSession; |
| 15 | 15 | ||
| 16 | class ClientPort final : public Object { | 16 | class ClientPort final : public Object { |
| 17 | public: | 17 | public: |
| @@ -29,15 +29,17 @@ public: | |||
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | /** | 31 | /** |
| 32 | * Adds the specified server session to the queue of pending sessions of the associated ServerPort | 32 | * Creates a new Session pair, adds the created ServerSession to the associated ServerPort's list of pending sessions, |
| 33 | * @param server_session Server session to add to the queue | 33 | * and signals the ServerPort, causing any threads waiting on it to awake. |
| 34 | * @returns ClientSession The client endpoint of the created Session pair. | ||
| 34 | */ | 35 | */ |
| 35 | void AddWaitingSession(SharedPtr<ServerSession> server_session); | 36 | SharedPtr<ClientSession> Connect(); |
| 36 | 37 | ||
| 37 | SharedPtr<ServerPort> server_port; ///< ServerPort associated with this client port. | 38 | SharedPtr<ServerPort> server_port; ///< ServerPort associated with this client port. |
| 38 | u32 max_sessions; ///< Maximum number of simultaneous sessions the port can have | 39 | u32 max_sessions; ///< Maximum number of simultaneous sessions the port can have |
| 39 | u32 active_sessions; ///< Number of currently open sessions to this port | 40 | u32 active_sessions; ///< Number of currently open sessions to this port |
| 40 | std::string name; ///< Name of client port (optional) | 41 | std::string name; ///< Name of client port (optional) |
| 42 | |||
| 41 | private: | 43 | private: |
| 42 | ClientPort(); | 44 | ClientPort(); |
| 43 | ~ClientPort() override; | 45 | ~ClientPort() override; |
diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index c90fbc69d..6c577610d 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp | |||
| @@ -20,7 +20,7 @@ ResultVal<SharedPtr<ClientSession>> ClientSession::Create(SharedPtr<ServerSessio | |||
| 20 | return MakeResult<SharedPtr<ClientSession>>(std::move(client_session)); | 20 | return MakeResult<SharedPtr<ClientSession>>(std::move(client_session)); |
| 21 | } | 21 | } |
| 22 | 22 | ||
| 23 | ResultCode ClientSession::HandleSyncRequest() { | 23 | ResultCode ClientSession::SendSyncRequest() { |
| 24 | // Signal the server session that new data is available | 24 | // Signal the server session that new data is available |
| 25 | return server_session->HandleSyncRequest(); | 25 | return server_session->HandleSyncRequest(); |
| 26 | } | 26 | } |
diff --git a/src/core/hle/kernel/client_session.h b/src/core/hle/kernel/client_session.h index e34528301..45f479901 100644 --- a/src/core/hle/kernel/client_session.h +++ b/src/core/hle/kernel/client_session.h | |||
| @@ -17,17 +17,12 @@ class ServerSession; | |||
| 17 | 17 | ||
| 18 | class ClientSession final : public Object { | 18 | class ClientSession final : public Object { |
| 19 | public: | 19 | public: |
| 20 | /** | 20 | friend class ServerSession; |
| 21 | * Creates a client session. | ||
| 22 | * @param server_session The server session associated with this client session | ||
| 23 | * @param name Optional name of client session | ||
| 24 | * @return The created client session | ||
| 25 | */ | ||
| 26 | static ResultVal<SharedPtr<ClientSession>> Create(SharedPtr<ServerSession> server_session, std::string name = "Unknown"); | ||
| 27 | 21 | ||
| 28 | std::string GetTypeName() const override { | 22 | std::string GetTypeName() const override { |
| 29 | return "ClientSession"; | 23 | return "ClientSession"; |
| 30 | } | 24 | } |
| 25 | |||
| 31 | std::string GetName() const override { | 26 | std::string GetName() const override { |
| 32 | return name; | 27 | return name; |
| 33 | } | 28 | } |
| @@ -38,10 +33,10 @@ public: | |||
| 38 | } | 33 | } |
| 39 | 34 | ||
| 40 | /** | 35 | /** |
| 41 | * Handle a SyncRequest from the emulated application. | 36 | * Sends an SyncRequest from the current emulated thread. |
| 42 | * @return ResultCode of the operation. | 37 | * @return ResultCode of the operation. |
| 43 | */ | 38 | */ |
| 44 | ResultCode HandleSyncRequest(); | 39 | ResultCode SendSyncRequest(); |
| 45 | 40 | ||
| 46 | std::string name; ///< Name of client port (optional) | 41 | std::string name; ///< Name of client port (optional) |
| 47 | SharedPtr<ServerSession> server_session; ///< The server session associated with this client session. | 42 | SharedPtr<ServerSession> server_session; ///< The server session associated with this client session. |
| @@ -49,6 +44,14 @@ public: | |||
| 49 | private: | 44 | private: |
| 50 | ClientSession(); | 45 | ClientSession(); |
| 51 | ~ClientSession() override; | 46 | ~ClientSession() override; |
| 47 | |||
| 48 | /** | ||
| 49 | * Creates a client session. | ||
| 50 | * @param server_session The server session associated with this client session | ||
| 51 | * @param name Optional name of client session | ||
| 52 | * @return The created client session | ||
| 53 | */ | ||
| 54 | static ResultVal<SharedPtr<ClientSession>> Create(SharedPtr<ServerSession> server_session, std::string name = "Unknown"); | ||
| 52 | }; | 55 | }; |
| 53 | 56 | ||
| 54 | } // namespace | 57 | } // namespace |
diff --git a/src/core/hle/kernel/server_port.cpp b/src/core/hle/kernel/server_port.cpp index 8e3ec8a14..f90fe76d5 100644 --- a/src/core/hle/kernel/server_port.cpp +++ b/src/core/hle/kernel/server_port.cpp | |||
| @@ -24,12 +24,13 @@ void ServerPort::Acquire() { | |||
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> ServerPort::CreatePortPair( | 26 | std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> ServerPort::CreatePortPair( |
| 27 | u32 max_sessions, std::string name) { | 27 | u32 max_sessions, std::string name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { |
| 28 | 28 | ||
| 29 | SharedPtr<ServerPort> server_port(new ServerPort); | 29 | SharedPtr<ServerPort> server_port(new ServerPort); |
| 30 | SharedPtr<ClientPort> client_port(new ClientPort); | 30 | SharedPtr<ClientPort> client_port(new ClientPort); |
| 31 | 31 | ||
| 32 | server_port->name = name + "_Server"; | 32 | server_port->name = name + "_Server"; |
| 33 | server_port->hle_handler = hle_handler; | ||
| 33 | client_port->name = name + "_Client"; | 34 | client_port->name = name + "_Client"; |
| 34 | client_port->server_port = server_port; | 35 | client_port->server_port = server_port; |
| 35 | client_port->max_sessions = max_sessions; | 36 | client_port->max_sessions = max_sessions; |
diff --git a/src/core/hle/kernel/server_port.h b/src/core/hle/kernel/server_port.h index fa9448ca0..dee0b1a9a 100644 --- a/src/core/hle/kernel/server_port.h +++ b/src/core/hle/kernel/server_port.h | |||
| @@ -9,6 +9,10 @@ | |||
| 9 | #include "common/common_types.h" | 9 | #include "common/common_types.h" |
| 10 | #include "core/hle/kernel/kernel.h" | 10 | #include "core/hle/kernel/kernel.h" |
| 11 | 11 | ||
| 12 | namespace Service { | ||
| 13 | class SessionRequestHandler; | ||
| 14 | } | ||
| 15 | |||
| 12 | namespace Kernel { | 16 | namespace Kernel { |
| 13 | 17 | ||
| 14 | class ClientPort; | 18 | class ClientPort; |
| @@ -19,10 +23,13 @@ public: | |||
| 19 | * Creates a pair of ServerPort and an associated ClientPort. | 23 | * Creates a pair of ServerPort and an associated ClientPort. |
| 20 | * @param max_sessions Maximum number of sessions to the port | 24 | * @param max_sessions Maximum number of sessions to the port |
| 21 | * @param name Optional name of the ports | 25 | * @param name Optional name of the ports |
| 26 | * @param hle_handler Optional HLE handler template for the port, | ||
| 27 | * ServerSessions crated from this port will inherit a reference to this handler. | ||
| 22 | * @return The created port tuple | 28 | * @return The created port tuple |
| 23 | */ | 29 | */ |
| 24 | static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair( | 30 | static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair( |
| 25 | u32 max_sessions, std::string name = "UnknownPort"); | 31 | u32 max_sessions, std::string name = "UnknownPort", |
| 32 | std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | ||
| 26 | 33 | ||
| 27 | std::string GetTypeName() const override { | 34 | std::string GetTypeName() const override { |
| 28 | return "ServerPort"; | 35 | return "ServerPort"; |
| @@ -41,6 +48,10 @@ public: | |||
| 41 | std::vector<SharedPtr<WaitObject>> | 48 | std::vector<SharedPtr<WaitObject>> |
| 42 | pending_sessions; ///< ServerSessions waiting to be accepted by the port | 49 | pending_sessions; ///< ServerSessions waiting to be accepted by the port |
| 43 | 50 | ||
| 51 | /// This session's HLE request handler template (optional) | ||
| 52 | /// ServerSessions created from this port inherit a reference to this handler. | ||
| 53 | std::shared_ptr<Service::SessionRequestHandler> hle_handler; | ||
| 54 | |||
| 44 | bool ShouldWait() override; | 55 | bool ShouldWait() override; |
| 45 | void Acquire() override; | 56 | void Acquire() override; |
| 46 | 57 | ||
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index be334efd7..3782cb493 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp | |||
| @@ -47,10 +47,10 @@ ResultCode ServerSession::HandleSyncRequest() { | |||
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | std::tuple<SharedPtr<ServerSession>, SharedPtr<ClientSession>> ServerSession::CreateSessionPair(const std::string& name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | 49 | std::tuple<SharedPtr<ServerSession>, SharedPtr<ClientSession>> ServerSession::CreateSessionPair(const std::string& name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { |
| 50 | auto server_session = ServerSession::Create(name + "Server", hle_handler).MoveFrom(); | 50 | auto server_session = ServerSession::Create(name + "_Server", hle_handler).MoveFrom(); |
| 51 | auto client_session = ClientSession::Create(server_session, name + "Client").MoveFrom(); | 51 | auto client_session = ClientSession::Create(server_session, name + "_Client").MoveFrom(); |
| 52 | 52 | ||
| 53 | return std::make_tuple(server_session, client_session); | 53 | return std::make_tuple(std::move(server_session), std::move(client_session)); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | } | 56 | } |
diff --git a/src/core/hle/kernel/server_session.h b/src/core/hle/kernel/server_session.h index 70661e9af..c73ccee73 100644 --- a/src/core/hle/kernel/server_session.h +++ b/src/core/hle/kernel/server_session.h | |||
| @@ -29,20 +29,8 @@ class ClientSession; | |||
| 29 | * the request, the response is marshalled back to the caller's TLS buffer and control is | 29 | * the request, the response is marshalled back to the caller's TLS buffer and control is |
| 30 | * transferred back to it. | 30 | * transferred back to it. |
| 31 | */ | 31 | */ |
| 32 | class ServerSession : public WaitObject { | 32 | class ServerSession final : public WaitObject { |
| 33 | public: | 33 | public: |
| 34 | ServerSession(); | ||
| 35 | ~ServerSession() override; | ||
| 36 | |||
| 37 | /** | ||
| 38 | * Creates a server session. The server session can have an optional HLE handler, | ||
| 39 | * which will be invoked to handle the IPC requests that this session receives. | ||
| 40 | * @param name Optional name of the server session. | ||
| 41 | * @param hle_handler Optional HLE handler for this server session. | ||
| 42 | * @return The created server session | ||
| 43 | */ | ||
| 44 | static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown", std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | ||
| 45 | |||
| 46 | std::string GetTypeName() const override { | 34 | std::string GetTypeName() const override { |
| 47 | return "ServerSession"; | 35 | return "ServerSession"; |
| 48 | } | 36 | } |
| @@ -61,10 +49,9 @@ public: | |||
| 61 | 49 | ||
| 62 | /** | 50 | /** |
| 63 | * Handle a sync request from the emulated application. | 51 | * Handle a sync request from the emulated application. |
| 64 | * Only HLE services should override this function. | ||
| 65 | * @returns ResultCode from the operation. | 52 | * @returns ResultCode from the operation. |
| 66 | */ | 53 | */ |
| 67 | virtual ResultCode HandleSyncRequest(); | 54 | ResultCode HandleSyncRequest(); |
| 68 | 55 | ||
| 69 | bool ShouldWait() override; | 56 | bool ShouldWait() override; |
| 70 | 57 | ||
| @@ -73,5 +60,18 @@ public: | |||
| 73 | std::string name; ///< The name of this session (optional) | 60 | std::string name; ///< The name of this session (optional) |
| 74 | bool signaled; ///< Whether there's new data available to this ServerSession | 61 | bool signaled; ///< Whether there's new data available to this ServerSession |
| 75 | std::shared_ptr<Service::SessionRequestHandler> hle_handler; ///< This session's HLE request handler (optional) | 62 | std::shared_ptr<Service::SessionRequestHandler> hle_handler; ///< This session's HLE request handler (optional) |
| 63 | |||
| 64 | private: | ||
| 65 | ServerSession(); | ||
| 66 | ~ServerSession() override; | ||
| 67 | |||
| 68 | /** | ||
| 69 | * Creates a server session. The server session can have an optional HLE handler, | ||
| 70 | * which will be invoked to handle the IPC requests that this session receives. | ||
| 71 | * @param name Optional name of the server session. | ||
| 72 | * @param hle_handler Optional HLE handler for this server session. | ||
| 73 | * @return The created server session | ||
| 74 | */ | ||
| 75 | static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown", std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | ||
| 76 | }; | 76 | }; |
| 77 | } | 77 | } |