aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs
diff options
context:
space:
mode:
authorMary <me@thog.eu>2021-12-30 10:55:06 +0100
committerGitHub <noreply@github.com>2021-12-30 10:55:06 +0100
commite96ef6d53250b72d084f7e6baf13e9bab485bca2 (patch)
tree5701772c89dbad3bf51bdf736714f9feb889472a /Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs
parent8544b1445b33381fca63714249ac36598c413004 (diff)
kernel: Implement thread pinning support (#2840)
* kernel: Implement Thread pinning support This commit adds support for 8.x thread pinning changes and implement SynchronizePreemptionState syscall. Based on kernel 13.x reverse. * Address gdkchan's comment * kernel: fix missing critical section leave in SetActivity Fix Unity games * Implement missing bits on the interrupt handler and inline update pinning function as it cannot be generic * Fix some bugs in SetActivity and SetCoreAndAffinityMask * Address gdkchan's comments
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs21
1 files changed, 21 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs
index 0982ceff..0c51b7b9 100644
--- a/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs
@@ -36,6 +36,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
private readonly KThread _idleThread;
public KThread PreviousThread => _previousThread;
+ public KThread CurrentThread => _currentThread;
public long LastContextSwitchTime { get; private set; }
public long TotalIdleTimeTicks => _idleThread.TotalTimeRunning;
@@ -87,6 +88,26 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
{
KThread thread = context.PriorityQueue.ScheduledThreads(core).FirstOrDefault();
+ if (thread != null &&
+ thread.Owner != null &&
+ thread.Owner.PinnedThreads[core] != null &&
+ thread.Owner.PinnedThreads[core] != thread)
+ {
+ KThread candidate = thread.Owner.PinnedThreads[core];
+
+ if (candidate.KernelWaitersCount == 0 && !thread.Owner.IsExceptionUserThread(candidate))
+ {
+ if (candidate.SchedFlags == ThreadSchedState.Running)
+ {
+ thread = candidate;
+ }
+ else
+ {
+ thread = null;
+ }
+ }
+ }
+
scheduledCoresMask |= context.Schedulers[core].SelectThread(thread);
}