summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorGravatar Subv2016-12-05 11:02:08 -0500
committerGravatar Subv2016-12-05 11:02:08 -0500
commitdd8887c8cfbb6d3010dde240278a3d4018c5dd85 (patch)
tree9990a463d5daccdab41ae9c90a5c698aed0d4795 /src/core/hle/kernel
parentDeclare empty ServerSession and ClientSession constructors as default. (diff)
downloadyuzu-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.cpp10
-rw-r--r--src/core/hle/kernel/client_port.h10
-rw-r--r--src/core/hle/kernel/client_session.cpp2
-rw-r--r--src/core/hle/kernel/client_session.h21
-rw-r--r--src/core/hle/kernel/server_port.cpp3
-rw-r--r--src/core/hle/kernel/server_port.h13
-rw-r--r--src/core/hle/kernel/server_session.cpp6
-rw-r--r--src/core/hle/kernel/server_session.h30
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 {
13ClientPort::ClientPort() {} 13ClientPort::ClientPort() {}
14ClientPort::~ClientPort() {} 14ClientPort::~ClientPort() {}
15 15
16void ClientPort::AddWaitingSession(SharedPtr<ServerSession> server_session) { 16SharedPtr<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 @@
11namespace Kernel { 11namespace Kernel {
12 12
13class ServerPort; 13class ServerPort;
14class ServerSession; 14class ClientSession;
15 15
16class ClientPort final : public Object { 16class ClientPort final : public Object {
17public: 17public:
@@ -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
41private: 43private:
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
23ResultCode ClientSession::HandleSyncRequest() { 23ResultCode 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
18class ClientSession final : public Object { 18class ClientSession final : public Object {
19public: 19public:
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:
49private: 44private:
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
26std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> ServerPort::CreatePortPair( 26std::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
12namespace Service {
13class SessionRequestHandler;
14}
15
12namespace Kernel { 16namespace Kernel {
13 17
14class ClientPort; 18class 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
49std::tuple<SharedPtr<ServerSession>, SharedPtr<ClientSession>> ServerSession::CreateSessionPair(const std::string& name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { 49std::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 */
32class ServerSession : public WaitObject { 32class ServerSession final : public WaitObject {
33public: 33public:
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
64private:
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}