summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel/svc/svc_activity.cpp
diff options
context:
space:
mode:
authorLiam <byteslice@airmail.cc>2022-10-05 02:15:40 +0200
committerLiam <byteslice@airmail.cc>2023-02-05 04:37:43 +0100
commit92eb091ddb9dfd96e59a75937e185079a63626e3 (patch)
treebe79f36453a4735088d9230e02f426792077eeb4 /src/core/hle/kernel/svc/svc_activity.cpp
parentMerge pull request #9720 from SoRadGaming/discordPresenceUpdate (diff)
downloadyuzu-92eb091ddb9dfd96e59a75937e185079a63626e3.tar
yuzu-92eb091ddb9dfd96e59a75937e185079a63626e3.tar.gz
yuzu-92eb091ddb9dfd96e59a75937e185079a63626e3.tar.bz2
yuzu-92eb091ddb9dfd96e59a75937e185079a63626e3.tar.lz
yuzu-92eb091ddb9dfd96e59a75937e185079a63626e3.tar.xz
yuzu-92eb091ddb9dfd96e59a75937e185079a63626e3.tar.zst
yuzu-92eb091ddb9dfd96e59a75937e185079a63626e3.zip
Diffstat (limited to '')
-rw-r--r--src/core/hle/kernel/svc/svc_activity.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/core/hle/kernel/svc/svc_activity.cpp b/src/core/hle/kernel/svc/svc_activity.cpp
new file mode 100644
index 000000000..8774a5c98
--- /dev/null
+++ b/src/core/hle/kernel/svc/svc_activity.cpp
@@ -0,0 +1,44 @@
+// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/core.h"
+#include "core/hle/kernel/k_process.h"
+#include "core/hle/kernel/k_thread.h"
+#include "core/hle/kernel/svc.h"
+#include "core/hle/kernel/svc_results.h"
+
+namespace Kernel::Svc {
+
+/// Sets the thread activity
+Result SetThreadActivity(Core::System& system, Handle thread_handle,
+ ThreadActivity thread_activity) {
+ LOG_DEBUG(Kernel_SVC, "called, handle=0x{:08X}, activity=0x{:08X}", thread_handle,
+ thread_activity);
+
+ // Validate the activity.
+ constexpr auto IsValidThreadActivity = [](ThreadActivity activity) {
+ return activity == ThreadActivity::Runnable || activity == ThreadActivity::Paused;
+ };
+ R_UNLESS(IsValidThreadActivity(thread_activity), ResultInvalidEnumValue);
+
+ // Get the thread from its handle.
+ KScopedAutoObject thread =
+ system.Kernel().CurrentProcess()->GetHandleTable().GetObject<KThread>(thread_handle);
+ R_UNLESS(thread.IsNotNull(), ResultInvalidHandle);
+
+ // Check that the activity is being set on a non-current thread for the current process.
+ R_UNLESS(thread->GetOwnerProcess() == system.Kernel().CurrentProcess(), ResultInvalidHandle);
+ R_UNLESS(thread.GetPointerUnsafe() != GetCurrentThreadPointer(system.Kernel()), ResultBusy);
+
+ // Set the activity.
+ R_TRY(thread->SetActivity(thread_activity));
+
+ return ResultSuccess;
+}
+
+Result SetThreadActivity32(Core::System& system, Handle thread_handle,
+ ThreadActivity thread_activity) {
+ return SetThreadActivity(system, thread_handle, thread_activity);
+}
+
+} // namespace Kernel::Svc