summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2017-06-05 22:39:26 -0700
committerGravatar Yuri Kunde Schlesner2017-06-06 02:56:32 -0700
commit6354d083594249fa1995be7b024943c258f63880 (patch)
treebe459930c35e50f698ef7747730092116eea6a74 /src/core/hle/kernel
parentResultVal: Add more convenience utils for creating and cascading results (diff)
downloadyuzu-6354d083594249fa1995be7b024943c258f63880.tar.gz
yuzu-6354d083594249fa1995be7b024943c258f63880.tar.xz
yuzu-6354d083594249fa1995be7b024943c258f63880.zip
Kernel: Add a dedicated SetHleHandler method to ServerPort/ServerSession
This allows attaching a HLE handle to a ServerPort at any point after it is created, allowing port/session creation to be generic between HLE and regular services.
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/client_port.cpp11
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp2
-rw-r--r--src/core/hle/kernel/hle_ipc.h3
-rw-r--r--src/core/hle/kernel/server_port.cpp3
-rw-r--r--src/core/hle/kernel/server_port.h14
-rw-r--r--src/core/hle/kernel/server_session.cpp16
-rw-r--r--src/core/hle/kernel/server_session.h20
7 files changed, 36 insertions, 33 deletions
diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp
index 45533ed45..ce5d94e99 100644
--- a/src/core/hle/kernel/client_port.cpp
+++ b/src/core/hle/kernel/client_port.cpp
@@ -26,20 +26,17 @@ ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() {
26 active_sessions++; 26 active_sessions++;
27 27
28 // Create a new session pair, let the created sessions inherit the parent port's HLE handler. 28 // Create a new session pair, let the created sessions inherit the parent port's HLE handler.
29 auto sessions = 29 auto sessions = ServerSession::CreateSessionPair(server_port->GetName(), this);
30 ServerSession::CreateSessionPair(server_port->GetName(), server_port->hle_handler, this);
31 auto client_session = std::get<SharedPtr<ClientSession>>(sessions);
32 auto server_session = std::get<SharedPtr<ServerSession>>(sessions);
33 30
34 if (server_port->hle_handler) 31 if (server_port->hle_handler)
35 server_port->hle_handler->ClientConnected(server_session); 32 server_port->hle_handler->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions));
36 else 33 else
37 server_port->pending_sessions.push_back(std::move(server_session)); 34 server_port->pending_sessions.push_back(std::get<SharedPtr<ServerSession>>(sessions));
38 35
39 // Wake the threads waiting on the ServerPort 36 // Wake the threads waiting on the ServerPort
40 server_port->WakeupAllWaitingThreads(); 37 server_port->WakeupAllWaitingThreads();
41 38
42 return MakeResult<SharedPtr<ClientSession>>(std::move(client_session)); 39 return MakeResult(std::get<SharedPtr<ClientSession>>(sessions));
43} 40}
44 41
45} // namespace 42} // namespace
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index 4886afa5c..0922b3f47 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -12,10 +12,12 @@
12namespace Kernel { 12namespace Kernel {
13 13
14void SessionRequestHandler::ClientConnected(SharedPtr<ServerSession> server_session) { 14void SessionRequestHandler::ClientConnected(SharedPtr<ServerSession> server_session) {
15 server_session->SetHleHandler(shared_from_this());
15 connected_sessions.push_back(server_session); 16 connected_sessions.push_back(server_session);
16} 17}
17 18
18void SessionRequestHandler::ClientDisconnected(SharedPtr<ServerSession> server_session) { 19void SessionRequestHandler::ClientDisconnected(SharedPtr<ServerSession> server_session) {
20 server_session->SetHleHandler(nullptr);
19 boost::range::remove_erase(connected_sessions, server_session); 21 boost::range::remove_erase(connected_sessions, server_session);
20} 22}
21 23
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h
index b3550734c..14f682f44 100644
--- a/src/core/hle/kernel/hle_ipc.h
+++ b/src/core/hle/kernel/hle_ipc.h
@@ -4,6 +4,7 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <memory>
7#include <vector> 8#include <vector>
8#include "core/hle/kernel/kernel.h" 9#include "core/hle/kernel/kernel.h"
9 10
@@ -16,7 +17,7 @@ class ServerSession;
16 * This can be provided to a ServerSession in order to hook into several relevant events 17 * 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 * (such as a new connection or a SyncRequest) so they can be implemented in the emulator.
18 */ 19 */
19class SessionRequestHandler { 20class SessionRequestHandler : public std::enable_shared_from_this<SessionRequestHandler> {
20public: 21public:
21 /** 22 /**
22 * Handles a sync request from the emulated application. 23 * Handles a sync request from the emulated application.
diff --git a/src/core/hle/kernel/server_port.cpp b/src/core/hle/kernel/server_port.cpp
index f6e0c7dbf..4d20c39a1 100644
--- a/src/core/hle/kernel/server_port.cpp
+++ b/src/core/hle/kernel/server_port.cpp
@@ -24,13 +24,12 @@ void ServerPort::Acquire(Thread* thread) {
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, std::shared_ptr<SessionRequestHandler> hle_handler) { 27 u32 max_sessions, std::string name) {
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 = std::move(hle_handler);
34 client_port->name = name + "_Client"; 33 client_port->name = name + "_Client";
35 client_port->server_port = server_port; 34 client_port->server_port = server_port;
36 client_port->max_sessions = max_sessions; 35 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 281559acf..f1419cd46 100644
--- a/src/core/hle/kernel/server_port.h
+++ b/src/core/hle/kernel/server_port.h
@@ -20,15 +20,13 @@ class ServerPort final : public WaitObject {
20public: 20public:
21 /** 21 /**
22 * Creates a pair of ServerPort and an associated ClientPort. 22 * Creates a pair of ServerPort and an associated ClientPort.
23 *
23 * @param max_sessions Maximum number of sessions to the port 24 * @param max_sessions Maximum number of sessions to the port
24 * @param name Optional name of the ports 25 * @param name Optional name of the ports
25 * @param hle_handler Optional HLE handler template for the port,
26 * ServerSessions crated from this port will inherit a reference to this handler.
27 * @return The created port tuple 26 * @return The created port tuple
28 */ 27 */
29 static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair( 28 static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair(
30 u32 max_sessions, std::string name = "UnknownPort", 29 u32 max_sessions, std::string name = "UnknownPort");
31 std::shared_ptr<SessionRequestHandler> hle_handler = nullptr);
32 30
33 std::string GetTypeName() const override { 31 std::string GetTypeName() const override {
34 return "ServerPort"; 32 return "ServerPort";
@@ -42,6 +40,14 @@ public:
42 return HANDLE_TYPE; 40 return HANDLE_TYPE;
43 } 41 }
44 42
43 /**
44 * Sets the HLE handler template for the port. ServerSessions crated by connecting to this port
45 * will inherit a reference to this handler.
46 */
47 void SetHleHandler(std::shared_ptr<SessionRequestHandler> hle_handler_) {
48 hle_handler = std::move(hle_handler_);
49 }
50
45 std::string name; ///< Name of port (optional) 51 std::string name; ///< Name of port (optional)
46 52
47 std::vector<SharedPtr<WaitObject>> 53 std::vector<SharedPtr<WaitObject>>
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp
index dc39d5229..2dc709bc9 100644
--- a/src/core/hle/kernel/server_session.cpp
+++ b/src/core/hle/kernel/server_session.cpp
@@ -28,16 +28,14 @@ ServerSession::~ServerSession() {
28 parent->server = nullptr; 28 parent->server = nullptr;
29} 29}
30 30
31ResultVal<SharedPtr<ServerSession>> ServerSession::Create( 31ResultVal<SharedPtr<ServerSession>> ServerSession::Create(std::string name) {
32 std::string name, std::shared_ptr<SessionRequestHandler> hle_handler) {
33 SharedPtr<ServerSession> server_session(new ServerSession); 32 SharedPtr<ServerSession> server_session(new ServerSession);
34 33
35 server_session->name = std::move(name); 34 server_session->name = std::move(name);
36 server_session->signaled = false; 35 server_session->signaled = false;
37 server_session->hle_handler = std::move(hle_handler);
38 server_session->parent = nullptr; 36 server_session->parent = nullptr;
39 37
40 return MakeResult<SharedPtr<ServerSession>>(std::move(server_session)); 38 return MakeResult(std::move(server_session));
41} 39}
42 40
43bool ServerSession::ShouldWait(Thread* thread) const { 41bool ServerSession::ShouldWait(Thread* thread) const {
@@ -71,13 +69,9 @@ ResultCode ServerSession::HandleSyncRequest() {
71 return RESULT_SUCCESS; 69 return RESULT_SUCCESS;
72} 70}
73 71
74ServerSession::SessionPair ServerSession::CreateSessionPair( 72ServerSession::SessionPair ServerSession::CreateSessionPair(const std::string& name,
75 const std::string& name, std::shared_ptr<SessionRequestHandler> hle_handler, 73 SharedPtr<ClientPort> port) {
76 SharedPtr<ClientPort> port) { 74 auto server_session = ServerSession::Create(name + "_Server").MoveFrom();
77
78 auto server_session =
79 ServerSession::Create(name + "_Server", std::move(hle_handler)).MoveFrom();
80
81 SharedPtr<ClientSession> client_session(new ClientSession); 75 SharedPtr<ClientSession> client_session(new ClientSession);
82 client_session->name = name + "_Client"; 76 client_session->name = name + "_Client";
83 77
diff --git a/src/core/hle/kernel/server_session.h b/src/core/hle/kernel/server_session.h
index 62d23cf0a..28f365b9e 100644
--- a/src/core/hle/kernel/server_session.h
+++ b/src/core/hle/kernel/server_session.h
@@ -50,14 +50,20 @@ public:
50 /** 50 /**
51 * Creates a pair of ServerSession and an associated ClientSession. 51 * Creates a pair of ServerSession and an associated ClientSession.
52 * @param name Optional name of the ports. 52 * @param name Optional name of the ports.
53 * @param hle_handler Optional HLE handler for this server session.
54 * @param client_port Optional The ClientPort that spawned this session. 53 * @param client_port Optional The ClientPort that spawned this session.
55 * @return The created session tuple 54 * @return The created session tuple
56 */ 55 */
57 static SessionPair CreateSessionPair( 56 static SessionPair CreateSessionPair(const std::string& name = "Unknown",
58 const std::string& name = "Unknown", 57 SharedPtr<ClientPort> client_port = nullptr);
59 std::shared_ptr<SessionRequestHandler> hle_handler = nullptr, 58
60 SharedPtr<ClientPort> client_port = nullptr); 59 /**
60 * Sets the HLE handler for the session. This handler will be called to service IPC requests
61 * instead of the regular IPC machinery. (The regular IPC machinery is currently not
62 * implemented.)
63 */
64 void SetHleHandler(std::shared_ptr<SessionRequestHandler> hle_handler_) {
65 hle_handler = std::move(hle_handler_);
66 }
61 67
62 /** 68 /**
63 * Handle a sync request from the emulated application. 69 * Handle a sync request from the emulated application.
@@ -83,11 +89,9 @@ private:
83 * Creates a server session. The server session can have an optional HLE handler, 89 * Creates a server session. The server session can have an optional HLE handler,
84 * which will be invoked to handle the IPC requests that this session receives. 90 * which will be invoked to handle the IPC requests that this session receives.
85 * @param name Optional name of the server session. 91 * @param name Optional name of the server session.
86 * @param hle_handler Optional HLE handler for this server session.
87 * @return The created server session 92 * @return The created server session
88 */ 93 */
89 static ResultVal<SharedPtr<ServerSession>> Create( 94 static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown");
90 std::string name = "Unknown", std::shared_ptr<SessionRequestHandler> hle_handler = nullptr);
91}; 95};
92 96
93/** 97/**