pineapple-src/src/core/hle/kernel/k_session.h

102 lines
2.3 KiB
C
Raw Normal View History

2021-05-02 06:03:43 +00:00
// 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 {
2021-06-05 05:15:09 +00:00
class SessionRequestManager;
2021-05-02 06:03:43 +00:00
class KSession final : public KAutoObjectWithSlabHeapAndContainer<KSession, KAutoObjectWithList> {
KERNEL_AUTOOBJECT_TRAITS(KSession, KAutoObject);
public:
2021-05-10 04:07:05 +00:00
explicit KSession(KernelCore& kernel_);
2021-05-29 10:00:09 +00:00
~KSession() override;
2021-05-02 06:03:43 +00:00
2021-06-05 05:15:09 +00:00
void Initialize(KClientPort* port_, const std::string& name_,
std::shared_ptr<SessionRequestManager> manager_ = nullptr);
2021-05-02 06:03:43 +00:00
2021-05-29 10:00:09 +00:00
void Finalize() override;
2021-05-02 06:03:43 +00:00
2021-05-29 10:00:09 +00:00
bool IsInitialized() const override {
2021-05-02 06:03:43 +00:00
return initialized;
}
2021-05-29 10:00:09 +00:00
uintptr_t GetPostDestroyArgument() const override {
2021-05-02 06:03:43 +00:00
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 KClientPort* GetParent() const {
return port;
}
2021-05-19 04:44:49 +00:00
KClientPort* GetParent() {
return port;
}
2021-05-02 06:03:43 +00:00
private:
enum class State : u8 {
Invalid = 0,
Normal = 1,
ClientClosed = 2,
ServerClosed = 3,
};
void SetState(State state) {
atomic_state = static_cast<u8>(state);
}
State GetState() const {
return static_cast<State>(atomic_state.load(std::memory_order_relaxed));
}
KServerSession server;
KClientSession client;
std::atomic<std::underlying_type_t<State>> atomic_state{
static_cast<std::underlying_type_t<State>>(State::Invalid)};
KClientPort* port{};
KProcess* process{};
bool initialized{};
};
} // namespace Kernel