summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/client_port.cpp2
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp12
-rw-r--r--src/core/hle/kernel/hle_ipc.h19
-rw-r--r--src/core/hle/kernel/k_event.h4
-rw-r--r--src/core/hle/kernel/svc.cpp2
5 files changed, 22 insertions, 17 deletions
diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp
index 0b6957e31..431a90d82 100644
--- a/src/core/hle/kernel/client_port.cpp
+++ b/src/core/hle/kernel/client_port.cpp
@@ -28,7 +28,7 @@ ResultVal<std::shared_ptr<ClientSession>> ClientPort::Connect() {
28 auto [client, server] = Kernel::Session::Create(kernel, name); 28 auto [client, server] = Kernel::Session::Create(kernel, name);
29 29
30 if (server_port->HasHLEHandler()) { 30 if (server_port->HasHLEHandler()) {
31 server_port->GetHLEHandler()->ClientConnected(std::move(server)); 31 server_port->GetHLEHandler()->ClientConnected(client, std::move(server));
32 } else { 32 } else {
33 server_port->AppendPendingSession(std::move(server)); 33 server_port->AppendPendingSession(std::move(server));
34 } 34 }
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index 6ffe6ac41..a9702539f 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -35,15 +35,17 @@ SessionRequestHandler::SessionRequestHandler() = default;
35 35
36SessionRequestHandler::~SessionRequestHandler() = default; 36SessionRequestHandler::~SessionRequestHandler() = default;
37 37
38void SessionRequestHandler::ClientConnected(std::shared_ptr<ServerSession> server_session) { 38void SessionRequestHandler::ClientConnected(std::shared_ptr<ClientSession> client_session,
39 std::shared_ptr<ServerSession> server_session) {
39 server_session->SetHleHandler(shared_from_this()); 40 server_session->SetHleHandler(shared_from_this());
40 connected_sessions.push_back(std::move(server_session)); 41 client_sessions.push_back(std::move(client_session));
42 server_sessions.push_back(std::move(server_session));
41} 43}
42 44
43void SessionRequestHandler::ClientDisconnected( 45void SessionRequestHandler::ClientDisconnected(
44 const std::shared_ptr<ServerSession>& server_session) { 46 const std::shared_ptr<ServerSession>& server_session) {
45 server_session->SetHleHandler(nullptr); 47 server_session->SetHleHandler(nullptr);
46 boost::range::remove_erase(connected_sessions, server_session); 48 boost::range::remove_erase(server_sessions, server_session);
47} 49}
48 50
49HLERequestContext::HLERequestContext(KernelCore& kernel_, Core::Memory::Memory& memory_, 51HLERequestContext::HLERequestContext(KernelCore& kernel_, Core::Memory::Memory& memory_,
@@ -223,12 +225,12 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(KThread& thread) {
223 // for specific values in each of these descriptors. 225 // for specific values in each of these descriptors.
224 for (auto& object : copy_objects) { 226 for (auto& object : copy_objects) {
225 ASSERT(object != nullptr); 227 ASSERT(object != nullptr);
226 dst_cmdbuf[current_offset++] = handle_table.Create(object).Unwrap(); 228 dst_cmdbuf[current_offset++] = handle_table.Create(SharedFrom(object)).Unwrap();
227 } 229 }
228 230
229 for (auto& object : move_objects) { 231 for (auto& object : move_objects) {
230 ASSERT(object != nullptr); 232 ASSERT(object != nullptr);
231 dst_cmdbuf[current_offset++] = handle_table.Create(object).Unwrap(); 233 dst_cmdbuf[current_offset++] = handle_table.Create(SharedFrom(object)).Unwrap();
232 } 234 }
233 } 235 }
234 236
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h
index 398f1c467..74a95bc76 100644
--- a/src/core/hle/kernel/hle_ipc.h
+++ b/src/core/hle/kernel/hle_ipc.h
@@ -39,6 +39,7 @@ class HandleTable;
39class HLERequestContext; 39class HLERequestContext;
40class KernelCore; 40class KernelCore;
41class Process; 41class Process;
42class ClientSession;
42class ServerSession; 43class ServerSession;
43class KThread; 44class KThread;
44class KReadableEvent; 45class KReadableEvent;
@@ -71,7 +72,8 @@ public:
71 * associated ServerSession alive for the duration of the connection. 72 * associated ServerSession alive for the duration of the connection.
72 * @param server_session Owning pointer to the ServerSession associated with the connection. 73 * @param server_session Owning pointer to the ServerSession associated with the connection.
73 */ 74 */
74 void ClientConnected(std::shared_ptr<ServerSession> server_session); 75 void ClientConnected(
76 std::shared_ptr<ClientSession> client_session, std::shared_ptr<ServerSession> server_session);
75 77
76 /** 78 /**
77 * Signals that a client has just disconnected from this HLE handler and releases the 79 * Signals that a client has just disconnected from this HLE handler and releases the
@@ -84,7 +86,8 @@ protected:
84 /// List of sessions that are connected to this handler. 86 /// List of sessions that are connected to this handler.
85 /// A ServerSession whose server endpoint is an HLE implementation is kept alive by this list 87 /// A ServerSession whose server endpoint is an HLE implementation is kept alive by this list
86 /// for the duration of the connection. 88 /// for the duration of the connection.
87 std::vector<std::shared_ptr<ServerSession>> connected_sessions; 89 std::vector<std::shared_ptr<ClientSession>> client_sessions;
90 std::vector<std::shared_ptr<ServerSession>> server_sessions;
88}; 91};
89 92
90/** 93/**
@@ -218,21 +221,21 @@ public:
218 } 221 }
219 222
220 template <typename T> 223 template <typename T>
221 std::shared_ptr<T> GetCopyObject(std::size_t index) { 224 T* GetCopyObject(std::size_t index) {
222 return DynamicObjectCast<T>(copy_objects.at(index)); 225 return DynamicObjectCast<T>(copy_objects.at(index));
223 } 226 }
224 227
225 template <typename T> 228 template <typename T>
226 std::shared_ptr<T> GetMoveObject(std::size_t index) { 229 T* GetMoveObject(std::size_t index) {
227 return DynamicObjectCast<T>(move_objects.at(index)); 230 return DynamicObjectCast<T>(move_objects.at(index));
228 } 231 }
229 232
230 void AddMoveObject(std::shared_ptr<Object> object) { 233 void AddMoveObject(Object* object) {
231 move_objects.emplace_back(std::move(object)); 234 move_objects.emplace_back(object);
232 } 235 }
233 236
234 void AddCopyObject(std::shared_ptr<Object> object) { 237 void AddCopyObject(Object* object) {
235 copy_objects.emplace_back(std::move(object)); 238 copy_objects.emplace_back(object);
236 } 239 }
237 240
238 void AddDomainObject(std::shared_ptr<SessionRequestHandler> object) { 241 void AddDomainObject(std::shared_ptr<SessionRequestHandler> object) {
diff --git a/src/core/hle/kernel/k_event.h b/src/core/hle/kernel/k_event.h
index 2fb887129..ec6894b16 100644
--- a/src/core/hle/kernel/k_event.h
+++ b/src/core/hle/kernel/k_event.h
@@ -32,8 +32,8 @@ public:
32 return HANDLE_TYPE; 32 return HANDLE_TYPE;
33 } 33 }
34 34
35 std::shared_ptr<KReadableEvent>& GetReadableEvent() { 35 KReadableEvent* GetReadableEvent() {
36 return readable_event; 36 return readable_event.get();
37 } 37 }
38 38
39 std::shared_ptr<KWritableEvent>& GetWritableEvent() { 39 std::shared_ptr<KWritableEvent>& GetWritableEvent() {
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 813450115..dca1bcc92 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -1976,7 +1976,7 @@ static ResultCode CreateEvent(Core::System& system, Handle* out_write, Handle* o
1976 auto handle_guard = SCOPE_GUARD({ handle_table.Remove(*write_create_result); }); 1976 auto handle_guard = SCOPE_GUARD({ handle_table.Remove(*write_create_result); });
1977 1977
1978 // Add the readable event to the handle table. 1978 // Add the readable event to the handle table.
1979 const auto read_create_result = handle_table.Create(event->GetReadableEvent()); 1979 const auto read_create_result = handle_table.Create(SharedFrom(event->GetReadableEvent()));
1980 if (read_create_result.Failed()) { 1980 if (read_create_result.Failed()) {
1981 return read_create_result.Code(); 1981 return read_create_result.Code();
1982 } 1982 }