aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/OsHle/Handles
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-06-26 01:09:32 -0300
committergdkchan <gab.dark.100@gmail.com>2018-06-26 01:10:15 -0300
commit65105c2a3bf136202decd5ec1f5d9626d636033b (patch)
treec877fcc5656aaeabfadd12f5cc8c5da5e72deb42 /Ryujinx.HLE/OsHle/Handles
parentc81809352865a9d3be4f9ce20beea4ae39373934 (diff)
Implement SvcGetThreadContext3
Diffstat (limited to 'Ryujinx.HLE/OsHle/Handles')
-rw-r--r--Ryujinx.HLE/OsHle/Handles/KProcessScheduler.cs25
-rw-r--r--Ryujinx.HLE/OsHle/Handles/KThread.cs2
-rw-r--r--Ryujinx.HLE/OsHle/Handles/SchedulerThread.cs2
3 files changed, 25 insertions, 4 deletions
diff --git a/Ryujinx.HLE/OsHle/Handles/KProcessScheduler.cs b/Ryujinx.HLE/OsHle/Handles/KProcessScheduler.cs
index 722460b1..011d9754 100644
--- a/Ryujinx.HLE/OsHle/Handles/KProcessScheduler.cs
+++ b/Ryujinx.HLE/OsHle/Handles/KProcessScheduler.cs
@@ -47,6 +47,8 @@ namespace Ryujinx.HLE.OsHle.Handles
if (TryAddToCore(Thread))
{
+ SchedThread.IsRunning = true;
+
Thread.Thread.Execute();
PrintDbgThreadInfo(Thread, "running.");
@@ -94,10 +96,7 @@ namespace Ryujinx.HLE.OsHle.Handles
public void SetThreadActivity(KThread Thread, bool Active)
{
- if (!AllThreads.TryGetValue(Thread, out SchedulerThread SchedThread))
- {
- throw new InvalidOperationException();
- }
+ SchedulerThread SchedThread = AllThreads[Thread];
SchedThread.IsActive = Active;
@@ -111,6 +110,16 @@ namespace Ryujinx.HLE.OsHle.Handles
}
}
+ public bool IsThreadRunning(KThread Thread)
+ {
+ if (!AllThreads.TryGetValue(Thread, out SchedulerThread SchedThread))
+ {
+ return false;
+ }
+
+ return SchedThread.IsRunning;
+ }
+
public void EnterWait(KThread Thread, int TimeoutMs = Timeout.Infinite)
{
SchedulerThread SchedThread = AllThreads[Thread];
@@ -161,6 +170,8 @@ namespace Ryujinx.HLE.OsHle.Handles
{
lock (SchedLock)
{
+ AllThreads[Thread].IsRunning = false;
+
PrintDbgThreadInfo(Thread, "suspended.");
int ActualCore = Thread.ActualCore;
@@ -252,6 +263,8 @@ namespace Ryujinx.HLE.OsHle.Handles
private void TryResumingExecution(SchedulerThread SchedThread)
{
+ SchedThread.IsRunning = false;
+
KThread Thread = SchedThread.Thread;
PrintDbgThreadInfo(Thread, "trying to resume...");
@@ -262,6 +275,8 @@ namespace Ryujinx.HLE.OsHle.Handles
{
if (TryAddToCore(Thread))
{
+ SchedThread.IsRunning = true;
+
PrintDbgThreadInfo(Thread, "resuming execution...");
return;
@@ -291,6 +306,8 @@ namespace Ryujinx.HLE.OsHle.Handles
{
PrintDbgThreadInfo(SchedThread.Thread, "running.");
}
+
+ SchedThread.IsRunning = true;
}
public void Resort(KThread Thread)
diff --git a/Ryujinx.HLE/OsHle/Handles/KThread.cs b/Ryujinx.HLE/OsHle/Handles/KThread.cs
index a135bb28..3db46f3d 100644
--- a/Ryujinx.HLE/OsHle/Handles/KThread.cs
+++ b/Ryujinx.HLE/OsHle/Handles/KThread.cs
@@ -29,6 +29,8 @@ namespace Ryujinx.HLE.OsHle.Handles
public int WaitHandle { get; set; }
+ public long LastPc { get; set; }
+
public int ThreadId => Thread.ThreadId;
public KThread(
diff --git a/Ryujinx.HLE/OsHle/Handles/SchedulerThread.cs b/Ryujinx.HLE/OsHle/Handles/SchedulerThread.cs
index 5bdefe74..0b7a3c30 100644
--- a/Ryujinx.HLE/OsHle/Handles/SchedulerThread.cs
+++ b/Ryujinx.HLE/OsHle/Handles/SchedulerThread.cs
@@ -11,6 +11,8 @@ namespace Ryujinx.HLE.OsHle.Handles
public bool IsActive { get; set; }
+ public bool IsRunning { get; set; }
+
public AutoResetEvent WaitSync { get; private set; }
public ManualResetEvent WaitActivity { get; private set; }
public AutoResetEvent WaitSched { get; private set; }