diff options
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/client_port.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 19 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_event.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 2 |
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 | ||
| 36 | SessionRequestHandler::~SessionRequestHandler() = default; | 36 | SessionRequestHandler::~SessionRequestHandler() = default; |
| 37 | 37 | ||
| 38 | void SessionRequestHandler::ClientConnected(std::shared_ptr<ServerSession> server_session) { | 38 | void 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 | ||
| 43 | void SessionRequestHandler::ClientDisconnected( | 45 | void 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 | ||
| 49 | HLERequestContext::HLERequestContext(KernelCore& kernel_, Core::Memory::Memory& memory_, | 51 | HLERequestContext::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; | |||
| 39 | class HLERequestContext; | 39 | class HLERequestContext; |
| 40 | class KernelCore; | 40 | class KernelCore; |
| 41 | class Process; | 41 | class Process; |
| 42 | class ClientSession; | ||
| 42 | class ServerSession; | 43 | class ServerSession; |
| 43 | class KThread; | 44 | class KThread; |
| 44 | class KReadableEvent; | 45 | class 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 | } |