diff options
author | Yuri Kunde Schlesner <yuriks@yuriks.net> | 2017-05-22 02:18:16 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-22 02:18:16 +0200 |
commit | cc566dadd8cd310658785b87b1692880ce51eeda (patch) | |
tree | 07136b798781adb9d864115f338eb62d09147949 /src/core/hle/kernel/server_session.cpp | |
parent | Merge pull request #2694 from Subv/vfp_vsub_ftz (diff) | |
parent | Kernel/Sessions: Remove the ClientSession::Create function. (diff) | |
download | yuzu-cc566dadd8cd310658785b87b1692880ce51eeda.tar yuzu-cc566dadd8cd310658785b87b1692880ce51eeda.tar.gz yuzu-cc566dadd8cd310658785b87b1692880ce51eeda.tar.bz2 yuzu-cc566dadd8cd310658785b87b1692880ce51eeda.tar.lz yuzu-cc566dadd8cd310658785b87b1692880ce51eeda.tar.xz yuzu-cc566dadd8cd310658785b87b1692880ce51eeda.tar.zst yuzu-cc566dadd8cd310658785b87b1692880ce51eeda.zip |
Diffstat (limited to 'src/core/hle/kernel/server_session.cpp')
-rw-r--r-- | src/core/hle/kernel/server_session.cpp | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 9447ff236..500b909ab 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp @@ -14,8 +14,15 @@ ServerSession::ServerSession() = default; ServerSession::~ServerSession() { // This destructor will be called automatically when the last ServerSession handle is closed by // the emulated application. - // TODO(Subv): Reduce the ClientPort's connection count, - // if the session is still open, set the connection status to 3 (Closed by server), + + // Decrease the port's connection count. + if (parent->port) + parent->port->active_sessions--; + + // TODO(Subv): Wake up all the ClientSession's waiting threads and set + // the SendSyncRequest result to 0xC920181A. + + parent->server = nullptr; } ResultVal<SharedPtr<ServerSession>> ServerSession::Create( @@ -25,6 +32,7 @@ ResultVal<SharedPtr<ServerSession>> ServerSession::Create( server_session->name = std::move(name); server_session->signaled = false; server_session->hle_handler = std::move(hle_handler); + server_session->parent = nullptr; return MakeResult<SharedPtr<ServerSession>>(std::move(server_session)); } @@ -61,13 +69,22 @@ ResultCode ServerSession::HandleSyncRequest() { } ServerSession::SessionPair ServerSession::CreateSessionPair( - const std::string& name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { + const std::string& name, std::shared_ptr<Service::SessionRequestHandler> hle_handler, + SharedPtr<ClientPort> port) { + auto server_session = ServerSession::Create(name + "_Server", std::move(hle_handler)).MoveFrom(); - // We keep a non-owning pointer to the ServerSession in the ClientSession because we don't want - // to prevent the ServerSession's destructor from being called when the emulated - // application closes the last ServerSession handle. - auto client_session = ClientSession::Create(server_session.get(), name + "_Client").MoveFrom(); + + SharedPtr<ClientSession> client_session(new ClientSession); + client_session->name = name + "_Client"; + + std::shared_ptr<Session> parent(new Session); + parent->client = client_session.get(); + parent->server = server_session.get(); + parent->port = port; + + client_session->parent = parent; + server_session->parent = parent; return std::make_tuple(std::move(server_session), std::move(client_session)); } |