diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2018-06-26 01:09:32 -0300 |
|---|---|---|
| committer | gdkchan <gab.dark.100@gmail.com> | 2018-06-26 01:10:15 -0300 |
| commit | 65105c2a3bf136202decd5ec1f5d9626d636033b (patch) | |
| tree | c877fcc5656aaeabfadd12f5cc8c5da5e72deb42 /Ryujinx.HLE/OsHle/Handles | |
| parent | c81809352865a9d3be4f9ce20beea4ae39373934 (diff) | |
Implement SvcGetThreadContext3
Diffstat (limited to 'Ryujinx.HLE/OsHle/Handles')
| -rw-r--r-- | Ryujinx.HLE/OsHle/Handles/KProcessScheduler.cs | 25 | ||||
| -rw-r--r-- | Ryujinx.HLE/OsHle/Handles/KThread.cs | 2 | ||||
| -rw-r--r-- | Ryujinx.HLE/OsHle/Handles/SchedulerThread.cs | 2 |
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; } |
