aboutsummaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/k_handle_table.cpp
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2026-06-23 06:31:25 +0200
committercrueter <crueter@eden-emu.dev>2026-06-23 06:31:25 +0200
commit3aa0d462598beb2021308eee1d757d74fe33b312 (patch)
treeed425c3845ba8fa61184d97b0588cb049b518bd7 /src/core/hle/kernel/k_handle_table.cpp
parentf8facda35fe7f17143f84bbfbdacc4cc48678946 (diff)
[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>
Diffstat (limited to 'src/core/hle/kernel/k_handle_table.cpp')
-rw-r--r--src/core/hle/kernel/k_handle_table.cpp53
1 files changed, 25 insertions, 28 deletions
diff --git a/src/core/hle/kernel/k_handle_table.cpp b/src/core/hle/kernel/k_handle_table.cpp
index 04ca235344..91d805fa79 100644
--- a/src/core/hle/kernel/k_handle_table.cpp
+++ b/src/core/hle/kernel/k_handle_table.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
@@ -6,28 +6,27 @@
#include "core/hle/kernel/k_handle_table.h"
#include "core/hle/kernel/k_process.h"
+#include "core/hle/kernel/kernel.h"
namespace Kernel {
-void KHandleTable::Finalize() {
+void KHandleTable::Finalize(KernelCore& kernel) {
// Get the table and clear our record of it.
u16 saved_table_size = 0;
{
- KScopedDisableDispatch dd{m_kernel};
+ KScopedDisableDispatch dd{kernel};
KScopedSpinLock lk(m_lock);
std::swap(m_table_size, saved_table_size);
}
// Close and free all entries.
- for (size_t i = 0; i < saved_table_size; i++) {
- if (KAutoObject* obj = m_objects[i]; obj != nullptr) {
- obj->Close();
- }
- }
+ for (size_t i = 0; i < saved_table_size; i++)
+ if (KAutoObject* obj = m_objects[i]; obj != nullptr)
+ obj->Close(kernel);
}
-bool KHandleTable::Remove(Handle handle) {
+bool KHandleTable::Remove(KernelCore& kernel, Handle handle) {
// Don't allow removal of a pseudo-handle.
if (Svc::IsPseudoHandle(handle)) [[unlikely]] {
return false;
@@ -42,7 +41,7 @@ bool KHandleTable::Remove(Handle handle) {
// Find the object and free the entry.
KAutoObject* obj = nullptr;
{
- KScopedDisableDispatch dd{m_kernel};
+ KScopedDisableDispatch dd{kernel};
KScopedSpinLock lk(m_lock);
if (this->IsValidHandle(handle)) [[likely]] {
@@ -56,13 +55,13 @@ bool KHandleTable::Remove(Handle handle) {
}
// Close the object.
- m_kernel.UnregisterInUseObject(obj);
- obj->Close();
+ kernel.UnregisterInUseObject(obj);
+ obj->Close(kernel);
return true;
}
-Result KHandleTable::Add(Handle* out_handle, KAutoObject* obj) {
- KScopedDisableDispatch dd{m_kernel};
+Result KHandleTable::Add(KernelCore& kernel, Handle* out_handle, KAutoObject* obj) {
+ KScopedDisableDispatch dd{kernel};
KScopedSpinLock lk(m_lock);
// Never exceed our capacity.
@@ -76,7 +75,7 @@ Result KHandleTable::Add(Handle* out_handle, KAutoObject* obj) {
m_entry_infos[index].linear_id = linear_id;
m_objects[index] = obj;
- obj->Open();
+ obj->Open(kernel);
*out_handle = EncodeHandle(static_cast<u16>(index), linear_id);
}
@@ -84,24 +83,22 @@ Result KHandleTable::Add(Handle* out_handle, KAutoObject* obj) {
R_SUCCEED();
}
-KScopedAutoObject<KAutoObject> KHandleTable::GetObjectForIpc(Handle handle,
- KThread* cur_thread) const {
+KScopedAutoObject<KAutoObject> KHandleTable::GetObjectForIpc(KernelCore& kernel, Handle handle, KThread* cur_thread) const {
// Handle pseudo-handles.
ASSERT(cur_thread != nullptr);
if (handle == Svc::PseudoHandle::CurrentProcess) {
auto* const cur_process = cur_thread->GetOwnerProcess();
ASSERT(cur_process != nullptr);
- return cur_process;
+ return {kernel, cur_process};
}
if (handle == Svc::PseudoHandle::CurrentThread) {
- return cur_thread;
+ return {kernel, cur_thread};
}
-
- return GetObjectForIpcWithoutPseudoHandle(handle);
+ return GetObjectForIpcWithoutPseudoHandle(kernel, handle);
}
-Result KHandleTable::Reserve(Handle* out_handle) {
- KScopedDisableDispatch dd{m_kernel};
+Result KHandleTable::Reserve(KernelCore& kernel, Handle* out_handle) {
+ KScopedDisableDispatch dd{kernel};
KScopedSpinLock lk(m_lock);
// Never exceed our capacity.
@@ -111,8 +108,8 @@ Result KHandleTable::Reserve(Handle* out_handle) {
R_SUCCEED();
}
-void KHandleTable::Unreserve(Handle handle) {
- KScopedDisableDispatch dd{m_kernel};
+void KHandleTable::Unreserve(KernelCore& kernel, Handle handle) {
+ KScopedDisableDispatch dd{kernel};
KScopedSpinLock lk(m_lock);
// Unpack the handle.
@@ -130,8 +127,8 @@ void KHandleTable::Unreserve(Handle handle) {
}
}
-void KHandleTable::Register(Handle handle, KAutoObject* obj) {
- KScopedDisableDispatch dd{m_kernel};
+void KHandleTable::Register(KernelCore& kernel, Handle handle, KAutoObject* obj) {
+ KScopedDisableDispatch dd{kernel};
KScopedSpinLock lk(m_lock);
// Unpack the handle.
@@ -149,7 +146,7 @@ void KHandleTable::Register(Handle handle, KAutoObject* obj) {
m_entry_infos[index].linear_id = static_cast<u16>(linear_id);
m_objects[index] = obj;
- obj->Open();
+ obj->Open(kernel);
}
}