aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core/OsHle/Kernel
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-05-13 00:22:42 -0300
committergdkchan <gab.dark.100@gmail.com>2018-05-13 00:22:42 -0300
commit4546d1b9be1052bbf82858d97795b33355bf64da (patch)
treea88286d145d8da522a81b3a265c538e7795b7f8d /Ryujinx.Core/OsHle/Kernel
parent3603497a137d14f2d65c5450133f2486a9f9620c (diff)
Initial work to support changing thread core on the scheduler, also some cond var priority fixes
Diffstat (limited to 'Ryujinx.Core/OsHle/Kernel')
-rw-r--r--Ryujinx.Core/OsHle/Kernel/SvcHandler.cs4
-rw-r--r--Ryujinx.Core/OsHle/Kernel/SvcSystem.cs4
-rw-r--r--Ryujinx.Core/OsHle/Kernel/SvcThread.cs4
-rw-r--r--Ryujinx.Core/OsHle/Kernel/SvcThreadSync.cs26
4 files changed, 18 insertions, 20 deletions
diff --git a/Ryujinx.Core/OsHle/Kernel/SvcHandler.cs b/Ryujinx.Core/OsHle/Kernel/SvcHandler.cs
index be394c4b..bbbd0fb0 100644
--- a/Ryujinx.Core/OsHle/Kernel/SvcHandler.cs
+++ b/Ryujinx.Core/OsHle/Kernel/SvcHandler.cs
@@ -22,8 +22,6 @@ namespace Ryujinx.Core.OsHle.Kernel
private ConcurrentDictionary<KThread, AutoResetEvent> SyncWaits;
- private object CondVarLock;
-
private HashSet<(HSharedMem, long)> MappedSharedMems;
private ulong CurrentHeapSize;
@@ -80,8 +78,6 @@ namespace Ryujinx.Core.OsHle.Kernel
SyncWaits = new ConcurrentDictionary<KThread, AutoResetEvent>();
- CondVarLock = new object();
-
MappedSharedMems = new HashSet<(HSharedMem, long)>();
}
diff --git a/Ryujinx.Core/OsHle/Kernel/SvcSystem.cs b/Ryujinx.Core/OsHle/Kernel/SvcSystem.cs
index e5b080a8..24317bdf 100644
--- a/Ryujinx.Core/OsHle/Kernel/SvcSystem.cs
+++ b/Ryujinx.Core/OsHle/Kernel/SvcSystem.cs
@@ -131,7 +131,7 @@ namespace Ryujinx.Core.OsHle.Kernel
Handles[HandlesCount] = WaitEvent;
- Process.Scheduler.Suspend(CurrThread.ProcessorId);
+ Process.Scheduler.Suspend(CurrThread);
int HandleIndex;
@@ -237,7 +237,7 @@ namespace Ryujinx.Core.OsHle.Kernel
if (Session != null)
{
- Process.Scheduler.Suspend(CurrThread.ProcessorId);
+ Process.Scheduler.Suspend(CurrThread);
IpcMessage Cmd = new IpcMessage(CmdData, CmdPtr);
diff --git a/Ryujinx.Core/OsHle/Kernel/SvcThread.cs b/Ryujinx.Core/OsHle/Kernel/SvcThread.cs
index ee45c02c..71f3347a 100644
--- a/Ryujinx.Core/OsHle/Kernel/SvcThread.cs
+++ b/Ryujinx.Core/OsHle/Kernel/SvcThread.cs
@@ -75,7 +75,7 @@ namespace Ryujinx.Core.OsHle.Kernel
}
else
{
- Process.Scheduler.Suspend(CurrThread.ProcessorId);
+ Process.Scheduler.Suspend(CurrThread);
Thread.Sleep(NsTimeConverter.GetTimeMs(Ns));
@@ -132,7 +132,7 @@ namespace Ryujinx.Core.OsHle.Kernel
private void SvcGetCurrentProcessorNumber(AThreadState ThreadState)
{
- ThreadState.X0 = (ulong)Process.GetThread(ThreadState.Tpidr).ProcessorId;
+ ThreadState.X0 = (ulong)Process.GetThread(ThreadState.Tpidr).ActualCore;
}
private void SvcGetThreadId(AThreadState ThreadState)
diff --git a/Ryujinx.Core/OsHle/Kernel/SvcThreadSync.cs b/Ryujinx.Core/OsHle/Kernel/SvcThreadSync.cs
index 57608cda..0ca2a5f9 100644
--- a/Ryujinx.Core/OsHle/Kernel/SvcThreadSync.cs
+++ b/Ryujinx.Core/OsHle/Kernel/SvcThreadSync.cs
@@ -260,17 +260,23 @@ namespace Ryujinx.Core.OsHle.Kernel
WaitThread.MutexAddress = MutexAddress;
WaitThread.CondVarAddress = CondVarAddress;
- lock (CondVarLock)
+ lock (Process.ThreadArbiterListLock)
{
- KThread CurrThread = Process.ThreadArbiterList;
+ KThread CurrThread = Process.ThreadArbiterListHead;
- if (CurrThread != null)
+ if (CurrThread == null || CurrThread.ActualPriority > WaitThread.ActualPriority)
+ {
+ WaitThread.NextCondVarThread = Process.ThreadArbiterListHead;
+
+ Process.ThreadArbiterListHead = WaitThread;
+ }
+ else
{
bool DoInsert = CurrThread != WaitThread;
while (CurrThread.NextCondVarThread != null)
{
- if (CurrThread.NextCondVarThread.ActualPriority < WaitThread.ActualPriority)
+ if (CurrThread.NextCondVarThread.ActualPriority > WaitThread.ActualPriority)
{
break;
}
@@ -293,10 +299,6 @@ namespace Ryujinx.Core.OsHle.Kernel
CurrThread.NextCondVarThread = WaitThread;
}
}
- else
- {
- Process.ThreadArbiterList = WaitThread;
- }
}
Ns.Log.PrintDebug(LogClass.KernelSvc, "Entering wait state...");
@@ -315,10 +317,10 @@ namespace Ryujinx.Core.OsHle.Kernel
private void CondVarSignal(long CondVarAddress, int Count)
{
- lock (CondVarLock)
+ lock (Process.ThreadArbiterListLock)
{
KThread PrevThread = null;
- KThread CurrThread = Process.ThreadArbiterList;
+ KThread CurrThread = Process.ThreadArbiterListHead;
while (CurrThread != null && (Count == -1 || Count > 0))
{
@@ -330,7 +332,7 @@ namespace Ryujinx.Core.OsHle.Kernel
}
else
{
- Process.ThreadArbiterList = CurrThread.NextCondVarThread;
+ Process.ThreadArbiterListHead = CurrThread.NextCondVarThread;
}
CurrThread.NextCondVarThread = null;
@@ -401,7 +403,7 @@ namespace Ryujinx.Core.OsHle.Kernel
return;
}
- if (CurrThread.NextMutexThread.ActualPriority < WaitThread.ActualPriority)
+ if (CurrThread.NextMutexThread.ActualPriority > WaitThread.ActualPriority)
{
break;
}