diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2018-12-18 03:33:36 -0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-12-18 03:33:36 -0200 |
| commit | 0039bb639493b2d1e2764cae380311ba8e87704b (patch) | |
| tree | 63a912a95c8261775c2acb8a5b9ca0f10ad4ae33 /Ryujinx.HLE/HOS/Kernel/Threading/KCoreContext.cs | |
| parent | 2534a7f10c627810e6e0272b4cc9758e90f733c1 (diff) | |
Refactor SVC handler (#540)
* Refactor SVC handler
* Get rid of KernelErr
* Split kernel code files into multiple folders
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Threading/KCoreContext.cs')
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KCoreContext.cs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KCoreContext.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KCoreContext.cs new file mode 100644 index 00000000..81cd8883 --- /dev/null +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KCoreContext.cs @@ -0,0 +1,81 @@ +using Ryujinx.Common; + +namespace Ryujinx.HLE.HOS.Kernel.Threading +{ + class KCoreContext + { + private KScheduler _scheduler; + + private HleCoreManager _coreManager; + + public bool ContextSwitchNeeded { get; private set; } + + public long LastContextSwitchTime { get; private set; } + + public long TotalIdleTimeTicks { get; private set; } //TODO + + public KThread CurrentThread { get; private set; } + public KThread SelectedThread { get; private set; } + + public KCoreContext(KScheduler scheduler, HleCoreManager coreManager) + { + _scheduler = scheduler; + _coreManager = coreManager; + } + + public void SelectThread(KThread thread) + { + SelectedThread = thread; + + if (SelectedThread != CurrentThread) + { + ContextSwitchNeeded = true; + } + } + + public void UpdateCurrentThread() + { + ContextSwitchNeeded = false; + + LastContextSwitchTime = PerformanceCounter.ElapsedMilliseconds; + + CurrentThread = SelectedThread; + + if (CurrentThread != null) + { + long currentTime = PerformanceCounter.ElapsedMilliseconds; + + CurrentThread.TotalTimeRunning += currentTime - CurrentThread.LastScheduledTime; + CurrentThread.LastScheduledTime = currentTime; + } + } + + public void ContextSwitch() + { + ContextSwitchNeeded = false; + + LastContextSwitchTime = PerformanceCounter.ElapsedMilliseconds; + + if (CurrentThread != null) + { + _coreManager.Reset(CurrentThread.Context.Work); + } + + CurrentThread = SelectedThread; + + if (CurrentThread != null) + { + long currentTime = PerformanceCounter.ElapsedMilliseconds; + + CurrentThread.TotalTimeRunning += currentTime - CurrentThread.LastScheduledTime; + CurrentThread.LastScheduledTime = currentTime; + + CurrentThread.ClearExclusive(); + + _coreManager.Set(CurrentThread.Context.Work); + + CurrentThread.Context.Execute(); + } + } + } +}
\ No newline at end of file |
