diff options
| author | 2017-06-06 08:01:18 -0700 | |
|---|---|---|
| committer | 2017-06-06 08:01:18 -0700 | |
| commit | 7d59c3acbf74698ad32935214cab70dc2f17833f (patch) | |
| tree | b1308e008f8a79d94350da54df2feb3a62013934 /src/core/hle/kernel | |
| parent | Merge pull request #2747 from atouchet/readme-url (diff) | |
| parent | HLE: Move SessionRequestHandler from Service:: to Kernel:: (diff) | |
| download | yuzu-7d59c3acbf74698ad32935214cab70dc2f17833f.tar.gz yuzu-7d59c3acbf74698ad32935214cab70dc2f17833f.tar.xz yuzu-7d59c3acbf74698ad32935214cab70dc2f17833f.zip | |
Merge pull request #2752 from yuriks/move-session-request-handler
HLE: Move SessionRequestHandler from Service:: to Kernel::
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/client_port.cpp | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/client_session.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 22 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 52 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_port.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_port.h | 9 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_session.cpp | 7 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_session.h | 9 |
8 files changed, 90 insertions, 15 deletions
diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp index 03ffdece1..45533ed45 100644 --- a/src/core/hle/kernel/client_port.cpp +++ b/src/core/hle/kernel/client_port.cpp | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include "core/hle/kernel/client_port.h" | 6 | #include "core/hle/kernel/client_port.h" |
| 7 | #include "core/hle/kernel/client_session.h" | 7 | #include "core/hle/kernel/client_session.h" |
| 8 | #include "core/hle/kernel/errors.h" | 8 | #include "core/hle/kernel/errors.h" |
| 9 | #include "core/hle/kernel/hle_ipc.h" | ||
| 9 | #include "core/hle/kernel/kernel.h" | 10 | #include "core/hle/kernel/kernel.h" |
| 10 | #include "core/hle/kernel/server_port.h" | 11 | #include "core/hle/kernel/server_port.h" |
| 11 | #include "core/hle/kernel/server_session.h" | 12 | #include "core/hle/kernel/server_session.h" |
diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index 783b1c061..6bc49ff64 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp | |||
| @@ -5,6 +5,8 @@ | |||
| 5 | #include "common/assert.h" | 5 | #include "common/assert.h" |
| 6 | 6 | ||
| 7 | #include "core/hle/kernel/client_session.h" | 7 | #include "core/hle/kernel/client_session.h" |
| 8 | #include "core/hle/kernel/errors.h" | ||
| 9 | #include "core/hle/kernel/hle_ipc.h" | ||
| 8 | #include "core/hle/kernel/server_session.h" | 10 | #include "core/hle/kernel/server_session.h" |
| 9 | 11 | ||
| 10 | namespace Kernel { | 12 | namespace Kernel { |
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp new file mode 100644 index 000000000..4886afa5c --- /dev/null +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | // Copyright 2017 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <boost/range/algorithm_ext/erase.hpp> | ||
| 6 | #include "common/assert.h" | ||
| 7 | #include "common/common_types.h" | ||
| 8 | #include "core/hle/kernel/hle_ipc.h" | ||
| 9 | #include "core/hle/kernel/kernel.h" | ||
| 10 | #include "core/hle/kernel/server_session.h" | ||
| 11 | |||
| 12 | namespace Kernel { | ||
| 13 | |||
| 14 | void SessionRequestHandler::ClientConnected(SharedPtr<ServerSession> server_session) { | ||
| 15 | connected_sessions.push_back(server_session); | ||
| 16 | } | ||
| 17 | |||
| 18 | void SessionRequestHandler::ClientDisconnected(SharedPtr<ServerSession> server_session) { | ||
| 19 | boost::range::remove_erase(connected_sessions, server_session); | ||
| 20 | } | ||
| 21 | |||
| 22 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h new file mode 100644 index 000000000..b3550734c --- /dev/null +++ b/src/core/hle/kernel/hle_ipc.h | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | // Copyright 2017 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <vector> | ||
| 8 | #include "core/hle/kernel/kernel.h" | ||
| 9 | |||
| 10 | namespace Kernel { | ||
| 11 | |||
| 12 | class ServerSession; | ||
| 13 | |||
| 14 | /** | ||
| 15 | * Interface implemented by HLE Session handlers. | ||
| 16 | * This can be provided to a ServerSession in order to hook into several relevant events | ||
| 17 | * (such as a new connection or a SyncRequest) so they can be implemented in the emulator. | ||
| 18 | */ | ||
| 19 | class SessionRequestHandler { | ||
| 20 | public: | ||
| 21 | /** | ||
| 22 | * Handles a sync request from the emulated application. | ||
| 23 | * @param server_session The ServerSession that was triggered for this sync request, | ||
| 24 | * it should be used to differentiate which client (As in ClientSession) we're answering to. | ||
| 25 | * TODO(Subv): Use a wrapper structure to hold all the information relevant to | ||
| 26 | * this request (ServerSession, Originator thread, Translated command buffer, etc). | ||
| 27 | * @returns ResultCode the result code of the translate operation. | ||
| 28 | */ | ||
| 29 | virtual void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) = 0; | ||
| 30 | |||
| 31 | /** | ||
| 32 | * Signals that a client has just connected to this HLE handler and keeps the | ||
| 33 | * associated ServerSession alive for the duration of the connection. | ||
| 34 | * @param server_session Owning pointer to the ServerSession associated with the connection. | ||
| 35 | */ | ||
| 36 | void ClientConnected(Kernel::SharedPtr<Kernel::ServerSession> server_session); | ||
| 37 | |||
| 38 | /** | ||
| 39 | * Signals that a client has just disconnected from this HLE handler and releases the | ||
| 40 | * associated ServerSession. | ||
| 41 | * @param server_session ServerSession associated with the connection. | ||
| 42 | */ | ||
| 43 | void ClientDisconnected(Kernel::SharedPtr<Kernel::ServerSession> server_session); | ||
| 44 | |||
| 45 | protected: | ||
| 46 | /// List of sessions that are connected to this handler. | ||
| 47 | /// A ServerSession whose server endpoint is an HLE implementation is kept alive by this list | ||
| 48 | // for the duration of the connection. | ||
| 49 | std::vector<Kernel::SharedPtr<Kernel::ServerSession>> connected_sessions; | ||
| 50 | }; | ||
| 51 | |||
| 52 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/server_port.cpp b/src/core/hle/kernel/server_port.cpp index fd3bbbcad..f6e0c7dbf 100644 --- a/src/core/hle/kernel/server_port.cpp +++ b/src/core/hle/kernel/server_port.cpp | |||
| @@ -24,8 +24,7 @@ void ServerPort::Acquire(Thread* thread) { | |||
| 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<SessionRequestHandler> hle_handler) { |
| 28 | std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | ||
| 29 | 28 | ||
| 30 | SharedPtr<ServerPort> server_port(new ServerPort); | 29 | SharedPtr<ServerPort> server_port(new ServerPort); |
| 31 | SharedPtr<ClientPort> client_port(new ClientPort); | 30 | SharedPtr<ClientPort> client_port(new ClientPort); |
diff --git a/src/core/hle/kernel/server_port.h b/src/core/hle/kernel/server_port.h index 2a24d8412..281559acf 100644 --- a/src/core/hle/kernel/server_port.h +++ b/src/core/hle/kernel/server_port.h | |||
| @@ -11,13 +11,10 @@ | |||
| 11 | #include "core/hle/kernel/kernel.h" | 11 | #include "core/hle/kernel/kernel.h" |
| 12 | #include "core/hle/kernel/wait_object.h" | 12 | #include "core/hle/kernel/wait_object.h" |
| 13 | 13 | ||
| 14 | namespace Service { | ||
| 15 | class SessionRequestHandler; | ||
| 16 | } | ||
| 17 | |||
| 18 | namespace Kernel { | 14 | namespace Kernel { |
| 19 | 15 | ||
| 20 | class ClientPort; | 16 | class ClientPort; |
| 17 | class SessionRequestHandler; | ||
| 21 | 18 | ||
| 22 | class ServerPort final : public WaitObject { | 19 | class ServerPort final : public WaitObject { |
| 23 | public: | 20 | public: |
| @@ -31,7 +28,7 @@ public: | |||
| 31 | */ | 28 | */ |
| 32 | static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair( | 29 | static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair( |
| 33 | u32 max_sessions, std::string name = "UnknownPort", | 30 | u32 max_sessions, std::string name = "UnknownPort", |
| 34 | std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | 31 | std::shared_ptr<SessionRequestHandler> hle_handler = nullptr); |
| 35 | 32 | ||
| 36 | std::string GetTypeName() const override { | 33 | std::string GetTypeName() const override { |
| 37 | return "ServerPort"; | 34 | return "ServerPort"; |
| @@ -52,7 +49,7 @@ public: | |||
| 52 | 49 | ||
| 53 | /// This session's HLE request handler template (optional) | 50 | /// This session's HLE request handler template (optional) |
| 54 | /// ServerSessions created from this port inherit a reference to this handler. | 51 | /// ServerSessions created from this port inherit a reference to this handler. |
| 55 | std::shared_ptr<Service::SessionRequestHandler> hle_handler; | 52 | std::shared_ptr<SessionRequestHandler> hle_handler; |
| 56 | 53 | ||
| 57 | bool ShouldWait(Thread* thread) const override; | 54 | bool ShouldWait(Thread* thread) const override; |
| 58 | void Acquire(Thread* thread) override; | 55 | void Acquire(Thread* thread) override; |
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 500b909ab..dc39d5229 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp | |||
| @@ -4,8 +4,11 @@ | |||
| 4 | 4 | ||
| 5 | #include <tuple> | 5 | #include <tuple> |
| 6 | 6 | ||
| 7 | #include "core/hle/kernel/client_port.h" | ||
| 7 | #include "core/hle/kernel/client_session.h" | 8 | #include "core/hle/kernel/client_session.h" |
| 9 | #include "core/hle/kernel/hle_ipc.h" | ||
| 8 | #include "core/hle/kernel/server_session.h" | 10 | #include "core/hle/kernel/server_session.h" |
| 11 | #include "core/hle/kernel/session.h" | ||
| 9 | #include "core/hle/kernel/thread.h" | 12 | #include "core/hle/kernel/thread.h" |
| 10 | 13 | ||
| 11 | namespace Kernel { | 14 | namespace Kernel { |
| @@ -26,7 +29,7 @@ ServerSession::~ServerSession() { | |||
| 26 | } | 29 | } |
| 27 | 30 | ||
| 28 | ResultVal<SharedPtr<ServerSession>> ServerSession::Create( | 31 | ResultVal<SharedPtr<ServerSession>> ServerSession::Create( |
| 29 | std::string name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | 32 | std::string name, std::shared_ptr<SessionRequestHandler> hle_handler) { |
| 30 | SharedPtr<ServerSession> server_session(new ServerSession); | 33 | SharedPtr<ServerSession> server_session(new ServerSession); |
| 31 | 34 | ||
| 32 | server_session->name = std::move(name); | 35 | server_session->name = std::move(name); |
| @@ -69,7 +72,7 @@ ResultCode ServerSession::HandleSyncRequest() { | |||
| 69 | } | 72 | } |
| 70 | 73 | ||
| 71 | ServerSession::SessionPair ServerSession::CreateSessionPair( | 74 | ServerSession::SessionPair ServerSession::CreateSessionPair( |
| 72 | const std::string& name, std::shared_ptr<Service::SessionRequestHandler> hle_handler, | 75 | const std::string& name, std::shared_ptr<SessionRequestHandler> hle_handler, |
| 73 | SharedPtr<ClientPort> port) { | 76 | SharedPtr<ClientPort> port) { |
| 74 | 77 | ||
| 75 | auto server_session = | 78 | auto server_session = |
diff --git a/src/core/hle/kernel/server_session.h b/src/core/hle/kernel/server_session.h index f1b76d8aa..62d23cf0a 100644 --- a/src/core/hle/kernel/server_session.h +++ b/src/core/hle/kernel/server_session.h | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | #include "core/hle/kernel/session.h" | 12 | #include "core/hle/kernel/session.h" |
| 13 | #include "core/hle/kernel/wait_object.h" | 13 | #include "core/hle/kernel/wait_object.h" |
| 14 | #include "core/hle/result.h" | 14 | #include "core/hle/result.h" |
| 15 | #include "core/hle/service/service.h" | ||
| 16 | #include "core/memory.h" | 15 | #include "core/memory.h" |
| 17 | 16 | ||
| 18 | namespace Kernel { | 17 | namespace Kernel { |
| @@ -20,6 +19,7 @@ namespace Kernel { | |||
| 20 | class ClientSession; | 19 | class ClientSession; |
| 21 | class ClientPort; | 20 | class ClientPort; |
| 22 | class ServerSession; | 21 | class ServerSession; |
| 22 | class SessionRequestHandler; | ||
| 23 | class Thread; | 23 | class Thread; |
| 24 | 24 | ||
| 25 | /** | 25 | /** |
| @@ -56,7 +56,7 @@ public: | |||
| 56 | */ | 56 | */ |
| 57 | static SessionPair CreateSessionPair( | 57 | static SessionPair CreateSessionPair( |
| 58 | const std::string& name = "Unknown", | 58 | const std::string& name = "Unknown", |
| 59 | std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr, | 59 | std::shared_ptr<SessionRequestHandler> hle_handler = nullptr, |
| 60 | SharedPtr<ClientPort> client_port = nullptr); | 60 | SharedPtr<ClientPort> client_port = nullptr); |
| 61 | 61 | ||
| 62 | /** | 62 | /** |
| @@ -72,7 +72,7 @@ public: | |||
| 72 | std::string name; ///< The name of this session (optional) | 72 | std::string name; ///< The name of this session (optional) |
| 73 | bool signaled; ///< Whether there's new data available to this ServerSession | 73 | bool signaled; ///< Whether there's new data available to this ServerSession |
| 74 | std::shared_ptr<Session> parent; ///< The parent session, which links to the client endpoint. | 74 | std::shared_ptr<Session> parent; ///< The parent session, which links to the client endpoint. |
| 75 | std::shared_ptr<Service::SessionRequestHandler> | 75 | std::shared_ptr<SessionRequestHandler> |
| 76 | hle_handler; ///< This session's HLE request handler (optional) | 76 | hle_handler; ///< This session's HLE request handler (optional) |
| 77 | 77 | ||
| 78 | private: | 78 | private: |
| @@ -87,8 +87,7 @@ private: | |||
| 87 | * @return The created server session | 87 | * @return The created server session |
| 88 | */ | 88 | */ |
| 89 | static ResultVal<SharedPtr<ServerSession>> Create( | 89 | static ResultVal<SharedPtr<ServerSession>> Create( |
| 90 | std::string name = "Unknown", | 90 | std::string name = "Unknown", std::shared_ptr<SessionRequestHandler> hle_handler = nullptr); |
| 91 | std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | ||
| 92 | }; | 91 | }; |
| 93 | 92 | ||
| 94 | /** | 93 | /** |