| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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.HostThread);
- }
- CurrentThread = SelectedThread;
- if (CurrentThread != null)
- {
- long currentTime = PerformanceCounter.ElapsedMilliseconds;
- CurrentThread.TotalTimeRunning += currentTime - CurrentThread.LastScheduledTime;
- CurrentThread.LastScheduledTime = currentTime;
- _coreManager.Set(CurrentThread.HostThread);
- CurrentThread.Execute();
- }
- }
- }
- }
|