mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-30 23:49:01 -05:00 
			
		
		
		
	kernel: Fix reference management for client/server session.
- Fixes shutdown crash and crash in Pokemon SwSh.
This commit is contained in:
		| @@ -16,20 +16,18 @@ ClientSession::ClientSession(KernelCore& kernel) : Object{kernel} {} | ||||
| ClientSession::~ClientSession() { | ||||
|     // This destructor will be called automatically when the last ClientSession handle is closed by | ||||
|     // the emulated application. | ||||
|     if (parent->server) { | ||||
|         parent->server->ClientDisconnected(); | ||||
|     if (auto server = parent->server.lock()) { | ||||
|         server->ClientDisconnected(); | ||||
|     } | ||||
|  | ||||
|     parent->client = nullptr; | ||||
| } | ||||
|  | ||||
| ResultCode ClientSession::SendSyncRequest(Thread* thread) { | ||||
|     // Keep ServerSession alive until we're done working with it. | ||||
|     if (parent->server == nullptr) | ||||
|         return ERR_SESSION_CLOSED_BY_REMOTE; | ||||
|  | ||||
|     // Signal the server session that new data is available | ||||
|     return parent->server->HandleSyncRequest(SharedFrom(thread)); | ||||
|     if (auto server = parent->server.lock()) { | ||||
|         return server->HandleSyncRequest(SharedFrom(thread)); | ||||
|     } | ||||
|  | ||||
|     return ERR_SESSION_CLOSED_BY_REMOTE; | ||||
| } | ||||
|  | ||||
| } // namespace Kernel | ||||
|   | ||||
| @@ -31,8 +31,6 @@ ServerSession::~ServerSession() { | ||||
|     if (parent->port) { | ||||
|         parent->port->ConnectionClosed(); | ||||
|     } | ||||
|  | ||||
|     parent->server = nullptr; | ||||
| } | ||||
|  | ||||
| ResultVal<std::shared_ptr<ServerSession>> ServerSession::Create(KernelCore& kernel, | ||||
| @@ -46,11 +44,13 @@ ResultVal<std::shared_ptr<ServerSession>> ServerSession::Create(KernelCore& kern | ||||
| } | ||||
|  | ||||
| bool ServerSession::ShouldWait(const Thread* thread) const { | ||||
|     // Closed sessions should never wait, an error will be returned from svcReplyAndReceive. | ||||
|     if (parent->client == nullptr) | ||||
|         return false; | ||||
|     // Wait if we have no pending requests, or if we're currently handling a request. | ||||
|     return pending_requesting_threads.empty() || currently_handling != nullptr; | ||||
|     if (auto client = parent->client.lock()) { | ||||
|         return pending_requesting_threads.empty() || currently_handling != nullptr; | ||||
|     } | ||||
|  | ||||
|     // Closed sessions should never wait, an error will be returned from svcReplyAndReceive. | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| void ServerSession::Acquire(Thread* thread) { | ||||
| @@ -192,9 +192,9 @@ ServerSession::SessionPair ServerSession::CreateSessionPair(KernelCore& kernel, | ||||
|     std::shared_ptr<ClientSession> client_session = std::make_shared<ClientSession>(kernel); | ||||
|     client_session->name = name + "_Client"; | ||||
|  | ||||
|     std::shared_ptr<Session> parent(new Session); | ||||
|     parent->client = client_session.get(); | ||||
|     parent->server = server_session.get(); | ||||
|     std::shared_ptr<Session> parent = std::make_shared<Session>(); | ||||
|     parent->client = client_session; | ||||
|     parent->server = server_session; | ||||
|     parent->port = std::move(port); | ||||
|  | ||||
|     client_session->parent = parent; | ||||
|   | ||||
| @@ -20,8 +20,8 @@ class ServerSession; | ||||
|  */ | ||||
| class Session final { | ||||
| public: | ||||
|     ClientSession* client = nullptr;  ///< The client endpoint of the session. | ||||
|     ServerSession* server = nullptr;  ///< The server endpoint of the session. | ||||
|     std::weak_ptr<ClientSession> client; ///< The client endpoint of the session. | ||||
|     std::weak_ptr<ServerSession> server; ///< The server endpoint of the session. | ||||
|     std::shared_ptr<ClientPort> port; ///< The port that this session is associated with (optional). | ||||
| }; | ||||
| } // namespace Kernel | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei