Browse Source
hle: kernel: Migrate KSession, KClientSession, and KServerSession to KAutoObject.
pull/15/merge
hle: kernel: Migrate KSession, KClientSession, and KServerSession to KAutoObject.
pull/15/merge
31 changed files with 412 additions and 356 deletions
-
12src/core/CMakeLists.txt
-
12src/core/hle/ipc_helpers.h
-
14src/core/hle/kernel/client_port.cpp
-
4src/core/hle/kernel/client_port.h
-
52src/core/hle/kernel/client_session.cpp
-
5src/core/hle/kernel/handle_table.cpp
-
23src/core/hle/kernel/hle_ipc.cpp
-
18src/core/hle/kernel/hle_ipc.h
-
4src/core/hle/kernel/init/init_slab_setup.cpp
-
31src/core/hle/kernel/k_client_session.cpp
-
54src/core/hle/kernel/k_client_session.h
-
65src/core/hle/kernel/k_server_session.cpp
-
73src/core/hle/kernel/k_server_session.h
-
67src/core/hle/kernel/k_session.cpp
-
108src/core/hle/kernel/k_session.h
-
8src/core/hle/kernel/kernel.h
-
10src/core/hle/kernel/server_port.cpp
-
8src/core/hle/kernel/server_port.h
-
29src/core/hle/kernel/service_thread.cpp
-
4src/core/hle/kernel/service_thread.h
-
41src/core/hle/kernel/session.cpp
-
64src/core/hle/kernel/session.h
-
18src/core/hle/kernel/svc.cpp
-
1src/core/hle/service/am/applets/applets.cpp
-
1src/core/hle/service/hid/hid.cpp
-
1src/core/hle/service/mm/mm_u.cpp
-
5src/core/hle/service/service.h
-
8src/core/hle/service/sm/controller.cpp
-
22src/core/hle/service/sm/sm.cpp
-
5src/core/hle/service/sm/sm.h
-
1src/core/hle/service/time/time.cpp
@ -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 |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue