1
0
Fork 0
forked from suyu/suyu

fixup! hle: kernel: Migrate KSession, KClientSession, and KServerSession to KAutoObject.

This commit is contained in:
bunnei 2021-05-01 12:48:41 -07:00
parent 1b074b8984
commit f6d45b747e
3 changed files with 28 additions and 22 deletions

View file

@ -47,11 +47,11 @@ public:
void Initialize(KSession* parent_, std::string&& name_);
constexpr KSession* GetParent() {
KSession* GetParent() {
return parent;
}
constexpr const KSession* GetParent() const {
const KSession* GetParent() const {
return parent;
}

View file

@ -49,25 +49,31 @@ void KSession::Initialize(KClientPort* port_, const std::string& name_) {
}
void KSession::Finalize() {
if (port != nullptr) {
if (port == nullptr) {
return;
}
port->OnSessionFinalized();
port->Close();
}
}
void KSession::OnServerClosed() {
if (GetState() == State::Normal) {
if (GetState() != State::Normal) {
return;
}
SetState(State::ServerClosed);
client.OnServerClosed();
}
}
void KSession::OnClientClosed() {
if (GetState() == State::Normal) {
if (GetState() != State::Normal) {
return;
}
SetState(State::ClientClosed);
server.OnClientClosed();
}
}
void KSession::PostDestroy(uintptr_t arg) {
// Release the session count resource the owner process holds.

View file

@ -16,14 +16,6 @@ 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;
@ -74,20 +66,28 @@ public:
return port;
}
private:
enum class State : u8 {
Invalid = 0,
Normal = 1,
ClientClosed = 2,
ServerClosed = 3,
};
private:
void SetState(State state) {
atomic_state = static_cast<u8>(state);
}
State GetState() const {
return static_cast<State>(atomic_state.load());
return static_cast<State>(atomic_state.load(std::memory_order_relaxed));
}
private:
KServerSession server;
KClientSession client;
std::atomic<std::underlying_type<State>::type> atomic_state{
static_cast<std::underlying_type<State>::type>(State::Invalid)};
std::atomic<std::underlying_type_t<State>> atomic_state{
static_cast<std::underlying_type_t<State>>(State::Invalid)};
KClientPort* port{};
KProcess* process{};
bool initialized{};