aboutsummaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc/svc_synchronization.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/svc/svc_synchronization.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/svc/svc_synchronization.cpp')
-rw-r--r--src/core/hle/kernel/svc/svc_synchronization.cpp52
1 files changed, 22 insertions, 30 deletions
diff --git a/src/core/hle/kernel/svc/svc_synchronization.cpp b/src/core/hle/kernel/svc/svc_synchronization.cpp
index fdd4408d4d..1b29fd5865 100644
--- a/src/core/hle/kernel/svc/svc_synchronization.cpp
+++ b/src/core/hle/kernel/svc/svc_synchronization.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 2023 yuzu Emulator Project
@@ -20,7 +20,7 @@ Result CloseHandle(Core::System& system, Handle handle) {
LOG_TRACE(Kernel_SVC, "Closing handle 0x{:08X}", handle);
// Remove the handle.
- R_UNLESS(GetCurrentProcess(system.Kernel()).GetHandleTable().Remove(handle),
+ R_UNLESS(GetCurrentProcess(system.Kernel()).GetHandleTable().Remove(system.Kernel(), handle),
ResultInvalidHandle);
R_SUCCEED();
@@ -35,17 +35,17 @@ Result ResetSignal(Core::System& system, Handle handle) {
// Try to reset as readable event.
{
- KScopedAutoObject readable_event = handle_table.GetObject<KReadableEvent>(handle);
+ KScopedAutoObject readable_event = handle_table.GetObject<KReadableEvent>(system.Kernel(), handle);
if (readable_event.IsNotNull()) {
- R_RETURN(readable_event->Reset());
+ R_RETURN(readable_event->Reset(system.Kernel()));
}
}
// Try to reset as process.
{
- KScopedAutoObject process = handle_table.GetObject<KProcess>(handle);
+ KScopedAutoObject process = handle_table.GetObject<KProcess>(system.Kernel(), handle);
if (process.IsNotNull()) {
- R_RETURN(process->Reset());
+ R_RETURN(process->Reset(system.Kernel()));
}
}
@@ -62,35 +62,30 @@ Result WaitSynchronization(Core::System& system, int32_t* out_index, u64 user_ha
R_UNLESS(0 <= num_handles && num_handles <= Svc::ArgumentHandleCountMax, ResultOutOfRange);
// Get the synchronization context.
- auto& kernel = system.Kernel();
- auto& handle_table = GetCurrentProcess(kernel).GetHandleTable();
- auto objs = GetCurrentThread(kernel).GetSynchronizationObjectBuffer();
- auto handles = GetCurrentThread(kernel).GetHandleBuffer();
+ auto& handle_table = GetCurrentProcess(system.Kernel()).GetHandleTable();
+ auto objs = GetCurrentThread(system.Kernel()).GetSynchronizationObjectBuffer();
+ auto handles = GetCurrentThread(system.Kernel()).GetHandleBuffer();
// Copy user handles.
if (num_handles > 0) {
// Get the handles.
- R_UNLESS(GetCurrentMemory(kernel).ReadBlock(user_handles, handles.data(),
- sizeof(Handle) * num_handles),
- ResultInvalidPointer);
+ R_UNLESS(GetCurrentMemory(system.Kernel()).ReadBlock(user_handles, handles.data(), sizeof(Handle) * num_handles), ResultInvalidPointer);
// Convert the handles to objects.
- R_UNLESS(handle_table.GetMultipleObjects<KSynchronizationObject>(
- objs.data(), handles.data(), num_handles),
- ResultInvalidHandle);
+ R_UNLESS(handle_table.GetMultipleObjects<KSynchronizationObject>(system.Kernel(), objs.data(), handles.data(), num_handles), ResultInvalidHandle);
}
// Ensure handles are closed when we're done.
SCOPE_EXIT {
for (auto i = 0; i < num_handles; ++i) {
- objs[i]->Close();
+ objs[i]->Close(system.Kernel());
}
};
// Convert the timeout from nanoseconds to ticks.
s64 timeout;
if (timeout_ns > 0) {
- u64 ticks = kernel.HardwareTimer().GetTick();
+ u64 ticks = system.Kernel().HardwareTimer().GetTick();
ticks += timeout_ns;
ticks += 2;
@@ -100,7 +95,7 @@ Result WaitSynchronization(Core::System& system, int32_t* out_index, u64 user_ha
}
// Wait on the objects.
- Result res = KSynchronizationObject::Wait(kernel, out_index, objs.data(), num_handles, timeout);
+ Result res = KSynchronizationObject::Wait(system.Kernel(), out_index, objs.data(), num_handles, timeout);
R_SUCCEED_IF(res == ResultSessionClosed);
R_RETURN(res);
@@ -111,31 +106,28 @@ Result CancelSynchronization(Core::System& system, Handle handle) {
LOG_TRACE(Kernel_SVC, "called handle={:#X}", handle);
// Get the thread from its handle.
- KScopedAutoObject thread =
- GetCurrentProcess(system.Kernel()).GetHandleTable().GetObject<KThread>(handle);
+ KScopedAutoObject thread = GetCurrentProcess(system.Kernel()).GetHandleTable().GetObject<KThread>(system.Kernel(), handle);
R_UNLESS(thread.IsNotNull(), ResultInvalidHandle);
// Cancel the thread's wait.
- thread->WaitCancel();
+ thread->WaitCancel(system.Kernel());
R_SUCCEED();
}
void SynchronizePreemptionState(Core::System& system) {
- auto& kernel = system.Kernel();
-
// Lock the scheduler.
- KScopedSchedulerLock sl{kernel};
+ KScopedSchedulerLock sl{system.Kernel()};
// If the current thread is pinned, unpin it.
- KProcess* cur_process = GetCurrentProcessPointer(kernel);
- const auto core_id = GetCurrentCoreId(kernel);
+ KProcess* cur_process = GetCurrentProcessPointer(system.Kernel());
+ const auto core_id = GetCurrentCoreId(system.Kernel());
- if (cur_process->GetPinnedThread(core_id) == GetCurrentThreadPointer(kernel)) {
+ if (cur_process->GetPinnedThread(core_id) == GetCurrentThreadPointer(system.Kernel())) {
// Clear the current thread's interrupt flag.
- GetCurrentThread(kernel).ClearInterruptFlag();
+ GetCurrentThread(system.Kernel()).ClearInterruptFlag(system.Kernel());
// Unpin the current thread.
- cur_process->UnpinCurrentThread();
+ cur_process->UnpinCurrentThread(system.Kernel());
}
}