diff options
| author | 2022-03-10 23:45:54 -0800 | |
|---|---|---|
| committer | 2022-03-14 18:14:53 -0700 | |
| commit | 07c9d9bdbdbf632624ca01ea83dbfa51176415ae (patch) | |
| tree | 7c9a425ed2c7397e679d24356e36ab54372c7755 /src | |
| parent | core: hle: kernel: k_memory_layout: Update kernel slab memory sizes. (diff) | |
| download | yuzu-07c9d9bdbdbf632624ca01ea83dbfa51176415ae.tar.gz yuzu-07c9d9bdbdbf632624ca01ea83dbfa51176415ae.tar.xz yuzu-07c9d9bdbdbf632624ca01ea83dbfa51176415ae.zip | |
core: hle: kernel: Use weak_ptr where possible for SessionRequestHandler and SessionRequestManager.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/ipc_helpers.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 9 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_port.cpp | 7 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_server_port.h | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_server_session.cpp | 7 | ||||
| -rw-r--r-- | src/core/hle/service/am/am.cpp | 4 |
7 files changed, 25 insertions, 14 deletions
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h index 026257115..3c4e45fcd 100644 --- a/src/core/hle/ipc_helpers.h +++ b/src/core/hle/ipc_helpers.h | |||
| @@ -385,7 +385,7 @@ public: | |||
| 385 | T PopRaw(); | 385 | T PopRaw(); |
| 386 | 386 | ||
| 387 | template <class T> | 387 | template <class T> |
| 388 | std::shared_ptr<T> PopIpcInterface() { | 388 | std::weak_ptr<T> PopIpcInterface() { |
| 389 | ASSERT(context->Session()->IsDomain()); | 389 | ASSERT(context->Session()->IsDomain()); |
| 390 | ASSERT(context->GetDomainMessageHeader().input_object_count > 0); | 390 | ASSERT(context->GetDomainMessageHeader().input_object_count > 0); |
| 391 | return context->GetDomainHandler<T>(Pop<u32>() - 1); | 391 | return context->GetDomainHandler<T>(Pop<u32>() - 1); |
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index e19544c54..38abc4fd1 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -45,7 +45,7 @@ bool SessionRequestManager::HasSessionRequestHandler(const HLERequestContext& co | |||
| 45 | LOG_CRITICAL(IPC, "object_id {} is too big!", object_id); | 45 | LOG_CRITICAL(IPC, "object_id {} is too big!", object_id); |
| 46 | return false; | 46 | return false; |
| 47 | } | 47 | } |
| 48 | return DomainHandler(object_id - 1) != nullptr; | 48 | return DomainHandler(object_id - 1).lock() != nullptr; |
| 49 | } else { | 49 | } else { |
| 50 | return session_handler != nullptr; | 50 | return session_handler != nullptr; |
| 51 | } | 51 | } |
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index 754b41ff6..670cc741c 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h | |||
| @@ -94,6 +94,7 @@ protected: | |||
| 94 | std::weak_ptr<ServiceThread> service_thread; | 94 | std::weak_ptr<ServiceThread> service_thread; |
| 95 | }; | 95 | }; |
| 96 | 96 | ||
| 97 | using SessionRequestHandlerWeakPtr = std::weak_ptr<SessionRequestHandler>; | ||
| 97 | using SessionRequestHandlerPtr = std::shared_ptr<SessionRequestHandler>; | 98 | using SessionRequestHandlerPtr = std::shared_ptr<SessionRequestHandler>; |
| 98 | 99 | ||
| 99 | /** | 100 | /** |
| @@ -139,7 +140,7 @@ public: | |||
| 139 | } | 140 | } |
| 140 | } | 141 | } |
| 141 | 142 | ||
| 142 | SessionRequestHandlerPtr DomainHandler(std::size_t index) const { | 143 | SessionRequestHandlerWeakPtr DomainHandler(std::size_t index) const { |
| 143 | ASSERT_MSG(index < DomainHandlerCount(), "Unexpected handler index {}", index); | 144 | ASSERT_MSG(index < DomainHandlerCount(), "Unexpected handler index {}", index); |
| 144 | return domain_handlers.at(index); | 145 | return domain_handlers.at(index); |
| 145 | } | 146 | } |
| @@ -328,10 +329,10 @@ public: | |||
| 328 | 329 | ||
| 329 | template <typename T> | 330 | template <typename T> |
| 330 | std::shared_ptr<T> GetDomainHandler(std::size_t index) const { | 331 | std::shared_ptr<T> GetDomainHandler(std::size_t index) const { |
| 331 | return std::static_pointer_cast<T>(manager->DomainHandler(index)); | 332 | return std::static_pointer_cast<T>(manager.lock()->DomainHandler(index).lock()); |
| 332 | } | 333 | } |
| 333 | 334 | ||
| 334 | void SetSessionRequestManager(std::shared_ptr<SessionRequestManager> manager_) { | 335 | void SetSessionRequestManager(std::weak_ptr<SessionRequestManager> manager_) { |
| 335 | manager = std::move(manager_); | 336 | manager = std::move(manager_); |
| 336 | } | 337 | } |
| 337 | 338 | ||
| @@ -374,7 +375,7 @@ private: | |||
| 374 | u32 handles_offset{}; | 375 | u32 handles_offset{}; |
| 375 | u32 domain_offset{}; | 376 | u32 domain_offset{}; |
| 376 | 377 | ||
| 377 | std::shared_ptr<SessionRequestManager> manager; | 378 | std::weak_ptr<SessionRequestManager> manager; |
| 378 | 379 | ||
| 379 | KernelCore& kernel; | 380 | KernelCore& kernel; |
| 380 | Core::Memory::Memory& memory; | 381 | Core::Memory::Memory& memory; |
diff --git a/src/core/hle/kernel/k_port.cpp b/src/core/hle/kernel/k_port.cpp index a8ba09c4a..ceb98709f 100644 --- a/src/core/hle/kernel/k_port.cpp +++ b/src/core/hle/kernel/k_port.cpp | |||
| @@ -57,7 +57,12 @@ ResultCode KPort::EnqueueSession(KServerSession* session) { | |||
| 57 | R_UNLESS(state == State::Normal, ResultPortClosed); | 57 | R_UNLESS(state == State::Normal, ResultPortClosed); |
| 58 | 58 | ||
| 59 | server.EnqueueSession(session); | 59 | server.EnqueueSession(session); |
| 60 | server.GetSessionRequestHandler()->ClientConnected(server.AcceptSession()); | 60 | |
| 61 | if (auto session_ptr = server.GetSessionRequestHandler().lock()) { | ||
| 62 | session_ptr->ClientConnected(server.AcceptSession()); | ||
| 63 | } else { | ||
| 64 | UNREACHABLE(); | ||
| 65 | } | ||
| 61 | 66 | ||
| 62 | return ResultSuccess; | 67 | return ResultSuccess; |
| 63 | } | 68 | } |
diff --git a/src/core/hle/kernel/k_server_port.h b/src/core/hle/kernel/k_server_port.h index 6302d5e61..2185736be 100644 --- a/src/core/hle/kernel/k_server_port.h +++ b/src/core/hle/kernel/k_server_port.h | |||
| @@ -30,11 +30,11 @@ public: | |||
| 30 | 30 | ||
| 31 | /// Whether or not this server port has an HLE handler available. | 31 | /// Whether or not this server port has an HLE handler available. |
| 32 | bool HasSessionRequestHandler() const { | 32 | bool HasSessionRequestHandler() const { |
| 33 | return session_handler != nullptr; | 33 | return !session_handler.expired(); |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | /// Gets the HLE handler for this port. | 36 | /// Gets the HLE handler for this port. |
| 37 | SessionRequestHandlerPtr GetSessionRequestHandler() const { | 37 | SessionRequestHandlerWeakPtr GetSessionRequestHandler() const { |
| 38 | return session_handler; | 38 | return session_handler; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| @@ -42,7 +42,7 @@ public: | |||
| 42 | * Sets the HLE handler template for the port. ServerSessions crated by connecting to this port | 42 | * Sets the HLE handler template for the port. ServerSessions crated by connecting to this port |
| 43 | * will inherit a reference to this handler. | 43 | * will inherit a reference to this handler. |
| 44 | */ | 44 | */ |
| 45 | void SetSessionHandler(SessionRequestHandlerPtr&& handler) { | 45 | void SetSessionHandler(SessionRequestHandlerWeakPtr&& handler) { |
| 46 | session_handler = std::move(handler); | 46 | session_handler = std::move(handler); |
| 47 | } | 47 | } |
| 48 | 48 | ||
| @@ -66,7 +66,7 @@ private: | |||
| 66 | void CleanupSessions(); | 66 | void CleanupSessions(); |
| 67 | 67 | ||
| 68 | SessionList session_list; | 68 | SessionList session_list; |
| 69 | SessionRequestHandlerPtr session_handler; | 69 | SessionRequestHandlerWeakPtr session_handler; |
| 70 | KPort* parent{}; | 70 | KPort* parent{}; |
| 71 | }; | 71 | }; |
| 72 | 72 | ||
diff --git a/src/core/hle/kernel/k_server_session.cpp b/src/core/hle/kernel/k_server_session.cpp index 4d94eb9cf..9cfbcbbc9 100644 --- a/src/core/hle/kernel/k_server_session.cpp +++ b/src/core/hle/kernel/k_server_session.cpp | |||
| @@ -98,7 +98,12 @@ ResultCode KServerSession::HandleDomainSyncRequest(Kernel::HLERequestContext& co | |||
| 98 | UNREACHABLE(); | 98 | UNREACHABLE(); |
| 99 | return ResultSuccess; // Ignore error if asserts are off | 99 | return ResultSuccess; // Ignore error if asserts are off |
| 100 | } | 100 | } |
| 101 | return manager->DomainHandler(object_id - 1)->HandleSyncRequest(*this, context); | 101 | if (auto strong_ptr = manager->DomainHandler(object_id - 1).lock()) { |
| 102 | return strong_ptr->HandleSyncRequest(*this, context); | ||
| 103 | } else { | ||
| 104 | UNREACHABLE(); | ||
| 105 | return ResultSuccess; | ||
| 106 | } | ||
| 102 | 107 | ||
| 103 | case IPC::DomainMessageHeader::CommandType::CloseVirtualHandle: { | 108 | case IPC::DomainMessageHeader::CommandType::CloseVirtualHandle: { |
| 104 | LOG_DEBUG(IPC, "CloseVirtualHandle, object_id=0x{:08X}", object_id); | 109 | LOG_DEBUG(IPC, "CloseVirtualHandle, object_id=0x{:08X}", object_id); |
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 2f8e21568..420de3c54 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp | |||
| @@ -980,7 +980,7 @@ private: | |||
| 980 | LOG_DEBUG(Service_AM, "called"); | 980 | LOG_DEBUG(Service_AM, "called"); |
| 981 | 981 | ||
| 982 | IPC::RequestParser rp{ctx}; | 982 | IPC::RequestParser rp{ctx}; |
| 983 | applet->GetBroker().PushNormalDataFromGame(rp.PopIpcInterface<IStorage>()); | 983 | applet->GetBroker().PushNormalDataFromGame(rp.PopIpcInterface<IStorage>().lock()); |
| 984 | 984 | ||
| 985 | IPC::ResponseBuilder rb{ctx, 2}; | 985 | IPC::ResponseBuilder rb{ctx, 2}; |
| 986 | rb.Push(ResultSuccess); | 986 | rb.Push(ResultSuccess); |
| @@ -1007,7 +1007,7 @@ private: | |||
| 1007 | LOG_DEBUG(Service_AM, "called"); | 1007 | LOG_DEBUG(Service_AM, "called"); |
| 1008 | 1008 | ||
| 1009 | IPC::RequestParser rp{ctx}; | 1009 | IPC::RequestParser rp{ctx}; |
| 1010 | applet->GetBroker().PushInteractiveDataFromGame(rp.PopIpcInterface<IStorage>()); | 1010 | applet->GetBroker().PushInteractiveDataFromGame(rp.PopIpcInterface<IStorage>().lock()); |
| 1011 | 1011 | ||
| 1012 | ASSERT(applet->IsInitialized()); | 1012 | ASSERT(applet->IsInitialized()); |
| 1013 | applet->ExecuteInteractive(); | 1013 | applet->ExecuteInteractive(); |