mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-10-28 18:34:19 +00:00
[video_core, hle] remove redundant parent references in system structs (#3908)
reworked a bit to remove references of parent objects and instead pass as arguments to methods to prevent useless reloads Signed-off-by: lizzie <lizzie@eden-emu.dev> Co-authored-by: maufeat <sahyno1996@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3908 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: crueter <crueter@eden-emu.dev>
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -7,25 +10,27 @@
|
||||
|
||||
namespace Service {
|
||||
|
||||
Event::Event(KernelHelpers::ServiceContext& ctx) {
|
||||
Event::Event(KernelHelpers::ServiceContext& ctx_)
|
||||
: ctx{ctx_}
|
||||
{
|
||||
m_event = ctx.CreateEvent("Event");
|
||||
}
|
||||
|
||||
Event::~Event() {
|
||||
m_event->GetReadableEvent().Close();
|
||||
m_event->Close();
|
||||
m_event->GetReadableEvent().Close(ctx.kernel);
|
||||
m_event->Close(ctx.kernel);
|
||||
}
|
||||
|
||||
void Event::Signal() {
|
||||
m_event->Signal();
|
||||
void Event::Signal(Kernel::KernelCore& kernel) noexcept {
|
||||
m_event->Signal(kernel);
|
||||
}
|
||||
|
||||
void Event::Clear() {
|
||||
m_event->Clear();
|
||||
void Event::Clear(Kernel::KernelCore& kernel) noexcept {
|
||||
m_event->Clear(kernel);
|
||||
}
|
||||
|
||||
Kernel::KReadableEvent* Event::GetHandle() {
|
||||
return &m_event->GetReadableEvent();
|
||||
Kernel::KReadableEvent* Event::GetHandle() noexcept {
|
||||
return std::addressof(m_event->GetReadableEvent());
|
||||
}
|
||||
|
||||
} // namespace Service
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace Kernel {
|
||||
class KernelCore;
|
||||
class KEvent;
|
||||
class KReadableEvent;
|
||||
} // namespace Kernel
|
||||
@@ -19,12 +23,12 @@ public:
|
||||
explicit Event(KernelHelpers::ServiceContext& ctx);
|
||||
~Event();
|
||||
|
||||
void Signal();
|
||||
void Clear();
|
||||
|
||||
Kernel::KReadableEvent* GetHandle();
|
||||
void Signal(Kernel::KernelCore& kernel) noexcept;
|
||||
void Clear(Kernel::KernelCore& kernel) noexcept;
|
||||
Kernel::KReadableEvent* GetHandle() noexcept;
|
||||
|
||||
private:
|
||||
KernelHelpers::ServiceContext& ctx;
|
||||
Kernel::KEvent* m_event;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -10,22 +13,22 @@ namespace Service {
|
||||
|
||||
Mutex::Mutex(Core::System& system) : m_system(system) {
|
||||
m_event = Kernel::KEvent::Create(system.Kernel());
|
||||
m_event->Initialize(nullptr);
|
||||
m_event->Initialize(system.Kernel(), nullptr);
|
||||
|
||||
// Register the event.
|
||||
Kernel::KEvent::Register(system.Kernel(), m_event);
|
||||
|
||||
ASSERT(R_SUCCEEDED(m_event->Signal()));
|
||||
ASSERT(R_SUCCEEDED(m_event->Signal(system.Kernel())));
|
||||
}
|
||||
|
||||
Mutex::~Mutex() {
|
||||
m_event->GetReadableEvent().Close();
|
||||
m_event->Close();
|
||||
m_event->GetReadableEvent().Close(m_system.Kernel());
|
||||
m_event->Close(m_system.Kernel());
|
||||
}
|
||||
|
||||
void Mutex::lock() {
|
||||
// Infinitely retry until we successfully clear the event.
|
||||
while (R_FAILED(m_event->GetReadableEvent().Reset())) {
|
||||
while (R_FAILED(m_event->GetReadableEvent().Reset(m_system.Kernel()))) {
|
||||
s32 index;
|
||||
Kernel::KSynchronizationObject* obj = &m_event->GetReadableEvent();
|
||||
|
||||
@@ -40,7 +43,7 @@ void Mutex::lock() {
|
||||
|
||||
void Mutex::unlock() {
|
||||
// Unlock.
|
||||
ASSERT(R_SUCCEEDED(m_event->Signal()));
|
||||
ASSERT(R_SUCCEEDED(m_event->Signal(m_system.Kernel())));
|
||||
}
|
||||
|
||||
} // namespace Service
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -10,14 +13,6 @@
|
||||
|
||||
namespace Service {
|
||||
|
||||
Process::Process(Core::System& system)
|
||||
: m_system(system), m_process(), m_main_thread_priority(), m_main_thread_stack_size(),
|
||||
m_process_started() {}
|
||||
|
||||
Process::~Process() {
|
||||
this->Finalize();
|
||||
}
|
||||
|
||||
bool Process::Initialize(Loader::AppLoader& loader, Loader::ResultStatus& out_load_result) {
|
||||
// First, ensure we are not holding another process.
|
||||
this->Finalize();
|
||||
@@ -28,7 +23,7 @@ bool Process::Initialize(Loader::AppLoader& loader, Loader::ResultStatus& out_lo
|
||||
|
||||
// On exit, ensure we free the additional reference to the process.
|
||||
SCOPE_EXIT {
|
||||
process->Close();
|
||||
process->Close(m_system.Kernel());
|
||||
};
|
||||
|
||||
// Insert process modules into memory.
|
||||
@@ -52,7 +47,7 @@ bool Process::Initialize(Loader::AppLoader& loader, Loader::ResultStatus& out_lo
|
||||
|
||||
// Take ownership of the process object.
|
||||
m_process = process;
|
||||
m_process->Open();
|
||||
m_process->Open(m_system.Kernel());
|
||||
|
||||
// We succeeded.
|
||||
return true;
|
||||
@@ -64,8 +59,7 @@ void Process::Finalize() {
|
||||
|
||||
// Close the process.
|
||||
if (m_process) {
|
||||
m_process->Close();
|
||||
|
||||
m_process->Close(m_system.Kernel());
|
||||
// TODO: remove this, kernel already tracks this
|
||||
m_system.Kernel().RemoveProcess(m_process);
|
||||
}
|
||||
@@ -85,7 +79,7 @@ bool Process::Run() {
|
||||
|
||||
// Start.
|
||||
if (m_process) {
|
||||
m_process->Run(m_main_thread_priority, m_main_thread_stack_size);
|
||||
m_process->Run(m_system.Kernel(), m_main_thread_priority, m_main_thread_stack_size);
|
||||
}
|
||||
|
||||
// Mark as started.
|
||||
@@ -97,13 +91,13 @@ bool Process::Run() {
|
||||
|
||||
void Process::Terminate() {
|
||||
if (m_process) {
|
||||
m_process->Terminate();
|
||||
m_process->Terminate(m_system.Kernel());
|
||||
}
|
||||
}
|
||||
|
||||
void Process::ResetSignal() {
|
||||
if (m_process) {
|
||||
m_process->Reset();
|
||||
m_process->Reset(m_system.Kernel());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,8 +138,7 @@ u64 Process::GetProgramId() const {
|
||||
|
||||
void Process::Suspend(bool suspended) {
|
||||
if (m_process) {
|
||||
m_process->SetActivity(suspended ? Kernel::Svc::ProcessActivity::Paused
|
||||
: Kernel::Svc::ProcessActivity::Runnable);
|
||||
m_process->SetActivity(m_system.Kernel(), suspended ? Kernel::Svc::ProcessActivity::Paused : Kernel::Svc::ProcessActivity::Runnable);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -22,8 +25,8 @@ namespace Service {
|
||||
|
||||
class Process {
|
||||
public:
|
||||
explicit Process(Core::System& system);
|
||||
~Process();
|
||||
inline explicit Process(Core::System& system) noexcept : m_system(system) {}
|
||||
inline ~Process() { this->Finalize(); }
|
||||
|
||||
bool Initialize(Loader::AppLoader& loader, Loader::ResultStatus& out_load_result);
|
||||
void Finalize();
|
||||
@@ -50,8 +53,8 @@ public:
|
||||
private:
|
||||
Core::System& m_system;
|
||||
Kernel::KProcess* m_process{};
|
||||
s32 m_main_thread_priority{};
|
||||
u64 m_main_thread_stack_size{};
|
||||
s32 m_main_thread_priority{};
|
||||
bool m_process_started{};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user