hle: kernel: Migrate KSession, KClientSession, and KServerSession to KAutoObject.
parent
2cb6106523
commit
7444963bbb
@ -1,52 +0,0 @@
|
|||||||
// Copyright 2019 yuzu emulator team
|
|
||||||
// Licensed under GPLv2 or any later version
|
|
||||||
// Refer to the license.txt file included.
|
|
||||||
|
|
||||||
#include "core/hle/kernel/client_session.h"
|
|
||||||
#include "core/hle/kernel/hle_ipc.h"
|
|
||||||
#include "core/hle/kernel/k_thread.h"
|
|
||||||
#include "core/hle/kernel/server_session.h"
|
|
||||||
#include "core/hle/kernel/session.h"
|
|
||||||
#include "core/hle/kernel/svc_results.h"
|
|
||||||
#include "core/hle/result.h"
|
|
||||||
|
|
||||||
namespace Kernel {
|
|
||||||
|
|
||||||
ClientSession::ClientSession(KernelCore& kernel) : KSynchronizationObject{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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ClientSession::IsSignaled() const {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultVal<std::shared_ptr<ClientSession>> ClientSession::Create(KernelCore& kernel,
|
|
||||||
std::shared_ptr<Session> parent,
|
|
||||||
std::string name) {
|
|
||||||
std::shared_ptr<ClientSession> client_session{std::make_shared<ClientSession>(kernel)};
|
|
||||||
|
|
||||||
client_session->name = std::move(name);
|
|
||||||
client_session->parent = std::move(parent);
|
|
||||||
|
|
||||||
return MakeResult(std::move(client_session));
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultCode ClientSession::SendSyncRequest(KThread* thread, Core::Memory::Memory& memory,
|
|
||||||
Core::Timing::CoreTiming& core_timing) {
|
|
||||||
// Keep ServerSession alive until we're done working with it.
|
|
||||||
if (!parent->Server()) {
|
|
||||||
return ResultSessionClosed;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Signal the server session that new data is available
|
|
||||||
return parent->Server()->HandleSyncRequest(std::move(thread), memory, core_timing);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Kernel
|
|
@ -0,0 +1,31 @@
|
|||||||
|
// Copyright 2021 yuzu emulator team
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include "core/hle/kernel/hle_ipc.h"
|
||||||
|
#include "core/hle/kernel/k_client_session.h"
|
||||||
|
#include "core/hle/kernel/k_server_session.h"
|
||||||
|
#include "core/hle/kernel/k_session.h"
|
||||||
|
#include "core/hle/kernel/k_thread.h"
|
||||||
|
#include "core/hle/kernel/svc_results.h"
|
||||||
|
#include "core/hle/result.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
|
||||||
|
KClientSession::KClientSession(KernelCore& kernel) : KAutoObjectWithSlabHeapAndContainer{kernel} {}
|
||||||
|
KClientSession::~KClientSession() = default;
|
||||||
|
|
||||||
|
void KClientSession::Destroy() {
|
||||||
|
parent->OnClientClosed();
|
||||||
|
parent->Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KClientSession::OnServerClosed() {}
|
||||||
|
|
||||||
|
ResultCode KClientSession::SendSyncRequest(KThread* thread, Core::Memory::Memory& memory,
|
||||||
|
Core::Timing::CoreTiming& core_timing) {
|
||||||
|
// Signal the server session that new data is available
|
||||||
|
return parent->GetServerSession().HandleSyncRequest(thread, memory, core_timing);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Kernel
|
@ -0,0 +1,67 @@
|
|||||||
|
// Copyright 2019 yuzu emulator team
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include "common/assert.h"
|
||||||
|
#include "core/hle/kernel/k_client_session.h"
|
||||||
|
#include "core/hle/kernel/k_scoped_resource_reservation.h"
|
||||||
|
#include "core/hle/kernel/k_server_session.h"
|
||||||
|
#include "core/hle/kernel/k_session.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
|
||||||
|
KSession::KSession(KernelCore& kernel)
|
||||||
|
: KAutoObjectWithSlabHeapAndContainer{kernel}, server{kernel}, client{kernel} {}
|
||||||
|
KSession::~KSession() = default;
|
||||||
|
|
||||||
|
void KSession::Initialize(std::string&& name_) {
|
||||||
|
// Increment reference count.
|
||||||
|
// Because reference count is one on creation, this will result
|
||||||
|
// in a reference count of two. Thus, when both server and client are closed
|
||||||
|
// this object will be destroyed.
|
||||||
|
Open();
|
||||||
|
|
||||||
|
// Create our sub sessions.
|
||||||
|
KAutoObject::Create(std::addressof(server));
|
||||||
|
KAutoObject::Create(std::addressof(client));
|
||||||
|
|
||||||
|
// Initialize our sub sessions.
|
||||||
|
server.Initialize(this, name_ + ":Server");
|
||||||
|
client.Initialize(this, name_ + ":Client");
|
||||||
|
|
||||||
|
// Set state and name.
|
||||||
|
SetState(State::Normal);
|
||||||
|
name = std::move(name_);
|
||||||
|
|
||||||
|
// Set our owner process.
|
||||||
|
process = kernel.CurrentProcess();
|
||||||
|
process->Open();
|
||||||
|
|
||||||
|
// Mark initialized.
|
||||||
|
initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KSession::Finalize() {}
|
||||||
|
|
||||||
|
void KSession::OnServerClosed() {
|
||||||
|
if (GetState() == State::Normal) {
|
||||||
|
SetState(State::ServerClosed);
|
||||||
|
client.OnServerClosed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KSession::OnClientClosed() {
|
||||||
|
if (GetState() == State::Normal) {
|
||||||
|
SetState(State::ClientClosed);
|
||||||
|
server.OnClientClosed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KSession::PostDestroy(uintptr_t arg) {
|
||||||
|
// Release the session count resource the owner process holds.
|
||||||
|
Process* owner = reinterpret_cast<Process*>(arg);
|
||||||
|
owner->GetResourceLimit()->Release(LimitableResource::Sessions, 1);
|
||||||
|
owner->Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Kernel
|
@ -0,0 +1,108 @@
|
|||||||
|
// Copyright 2021 yuzu emulator team
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "core/hle/kernel/k_client_session.h"
|
||||||
|
#include "core/hle/kernel/k_server_session.h"
|
||||||
|
#include "core/hle/kernel/slab_helpers.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
|
||||||
|
class KSession final : public KAutoObjectWithSlabHeapAndContainer<KSession, KAutoObjectWithList> {
|
||||||
|
KERNEL_AUTOOBJECT_TRAITS(KSession, KAutoObject);
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum class State : u8 {
|
||||||
|
Invalid = 0,
|
||||||
|
Normal = 1,
|
||||||
|
ClientClosed = 2,
|
||||||
|
ServerClosed = 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit KSession(KernelCore& kernel);
|
||||||
|
virtual ~KSession() override;
|
||||||
|
|
||||||
|
void Initialize(std::string&& name_);
|
||||||
|
|
||||||
|
virtual void Finalize() override;
|
||||||
|
|
||||||
|
virtual bool IsInitialized() const override {
|
||||||
|
return initialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual uintptr_t GetPostDestroyArgument() const override {
|
||||||
|
return reinterpret_cast<uintptr_t>(process);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PostDestroy(uintptr_t arg);
|
||||||
|
|
||||||
|
void OnServerClosed();
|
||||||
|
|
||||||
|
void OnClientClosed();
|
||||||
|
|
||||||
|
bool IsServerClosed() const {
|
||||||
|
return this->GetState() != State::Normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsClientClosed() const {
|
||||||
|
return this->GetState() != State::Normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
KClientSession& GetClientSession() {
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
KServerSession& GetServerSession() {
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
const KClientSession& GetClientSession() const {
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
const KServerSession& GetServerSession() const {
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ClientPort* GetParent() const {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
// DEPRECATED
|
||||||
|
|
||||||
|
std::string GetName() const override {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr HandleType HANDLE_TYPE = HandleType::Session;
|
||||||
|
HandleType GetHandleType() const override {
|
||||||
|
return HANDLE_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void SetState(State state) {
|
||||||
|
atomic_state = static_cast<u8>(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
State GetState() const {
|
||||||
|
return static_cast<State>(atomic_state.load());
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
KServerSession server;
|
||||||
|
KClientSession client;
|
||||||
|
std::atomic<std::underlying_type<State>::type> atomic_state{
|
||||||
|
static_cast<std::underlying_type<State>::type>(State::Invalid)};
|
||||||
|
ClientPort* port{};
|
||||||
|
std::string name;
|
||||||
|
Process* process{};
|
||||||
|
bool initialized{};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Kernel
|
@ -1,41 +0,0 @@
|
|||||||
// Copyright 2019 yuzu emulator team
|
|
||||||
// Licensed under GPLv2 or any later version
|
|
||||||
// Refer to the license.txt file included.
|
|
||||||
|
|
||||||
#include "common/assert.h"
|
|
||||||
#include "core/hle/kernel/client_session.h"
|
|
||||||
#include "core/hle/kernel/k_scoped_resource_reservation.h"
|
|
||||||
#include "core/hle/kernel/server_session.h"
|
|
||||||
#include "core/hle/kernel/session.h"
|
|
||||||
|
|
||||||
namespace Kernel {
|
|
||||||
|
|
||||||
Session::Session(KernelCore& kernel) : KSynchronizationObject{kernel} {}
|
|
||||||
Session::~Session() {
|
|
||||||
// Release reserved resource when the Session pair was created.
|
|
||||||
kernel.GetSystemResourceLimit()->Release(LimitableResource::Sessions, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
Session::SessionPair Session::Create(KernelCore& kernel, std::string name) {
|
|
||||||
// Reserve a new session from the resource limit.
|
|
||||||
KScopedResourceReservation session_reservation(kernel.GetSystemResourceLimit(),
|
|
||||||
LimitableResource::Sessions);
|
|
||||||
ASSERT(session_reservation.Succeeded());
|
|
||||||
auto session{std::make_shared<Session>(kernel)};
|
|
||||||
auto client_session{Kernel::ClientSession::Create(kernel, session, name + "_Client").Unwrap()};
|
|
||||||
auto server_session{Kernel::ServerSession::Create(kernel, session, name + "_Server").Unwrap()};
|
|
||||||
|
|
||||||
session->name = std::move(name);
|
|
||||||
session->client = client_session;
|
|
||||||
session->server = server_session;
|
|
||||||
|
|
||||||
session_reservation.Commit();
|
|
||||||
return std::make_pair(std::move(client_session), std::move(server_session));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Session::IsSignaled() const {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Kernel
|
|
@ -1,64 +0,0 @@
|
|||||||
// Copyright 2019 yuzu emulator team
|
|
||||||
// Licensed under GPLv2 or any later version
|
|
||||||
// Refer to the license.txt file included.
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
#include "core/hle/kernel/k_synchronization_object.h"
|
|
||||||
|
|
||||||
namespace Kernel {
|
|
||||||
|
|
||||||
class ClientSession;
|
|
||||||
class ServerSession;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parent structure to link the client and server endpoints of a session with their associated
|
|
||||||
* client port.
|
|
||||||
*/
|
|
||||||
class Session final : public KSynchronizationObject {
|
|
||||||
public:
|
|
||||||
explicit Session(KernelCore& kernel);
|
|
||||||
~Session() override;
|
|
||||||
|
|
||||||
using SessionPair = std::pair<std::shared_ptr<ClientSession>, std::shared_ptr<ServerSession>>;
|
|
||||||
|
|
||||||
static SessionPair Create(KernelCore& kernel, std::string name = "Unknown");
|
|
||||||
|
|
||||||
std::string GetName() const override {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
static constexpr HandleType HANDLE_TYPE = HandleType::Session;
|
|
||||||
HandleType GetHandleType() const override {
|
|
||||||
return HANDLE_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsSignaled() const override;
|
|
||||||
|
|
||||||
void Finalize() override {}
|
|
||||||
|
|
||||||
std::shared_ptr<ClientSession> Client() {
|
|
||||||
if (auto result{client.lock()}) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<ServerSession> Server() {
|
|
||||||
if (auto result{server.lock()}) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string name;
|
|
||||||
std::weak_ptr<ClientSession> client;
|
|
||||||
std::weak_ptr<ServerSession> server;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Kernel
|
|
Loading…
Reference in New Issue