KCoreContext.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using Ryujinx.Common;
  2. namespace Ryujinx.HLE.HOS.Kernel
  3. {
  4. class KCoreContext
  5. {
  6. private KScheduler Scheduler;
  7. private HleCoreManager CoreManager;
  8. public bool ContextSwitchNeeded { get; private set; }
  9. public long LastContextSwitchTime { get; private set; }
  10. public long TotalIdleTimeTicks { get; private set; } //TODO
  11. public KThread CurrentThread { get; private set; }
  12. public KThread SelectedThread { get; private set; }
  13. public KCoreContext(KScheduler Scheduler, HleCoreManager CoreManager)
  14. {
  15. this.Scheduler = Scheduler;
  16. this.CoreManager = CoreManager;
  17. }
  18. public void SelectThread(KThread Thread)
  19. {
  20. SelectedThread = Thread;
  21. if (SelectedThread != CurrentThread)
  22. {
  23. ContextSwitchNeeded = true;
  24. }
  25. }
  26. public void UpdateCurrentThread()
  27. {
  28. ContextSwitchNeeded = false;
  29. LastContextSwitchTime = PerformanceCounter.ElapsedMilliseconds;
  30. CurrentThread = SelectedThread;
  31. if (CurrentThread != null)
  32. {
  33. long CurrentTime = PerformanceCounter.ElapsedMilliseconds;
  34. CurrentThread.TotalTimeRunning += CurrentTime - CurrentThread.LastScheduledTime;
  35. CurrentThread.LastScheduledTime = CurrentTime;
  36. }
  37. }
  38. public void ContextSwitch()
  39. {
  40. ContextSwitchNeeded = false;
  41. LastContextSwitchTime = PerformanceCounter.ElapsedMilliseconds;
  42. if (CurrentThread != null)
  43. {
  44. CoreManager.Reset(CurrentThread.Context.Work);
  45. }
  46. CurrentThread = SelectedThread;
  47. if (CurrentThread != null)
  48. {
  49. long CurrentTime = PerformanceCounter.ElapsedMilliseconds;
  50. CurrentThread.TotalTimeRunning += CurrentTime - CurrentThread.LastScheduledTime;
  51. CurrentThread.LastScheduledTime = CurrentTime;
  52. CurrentThread.ClearExclusive();
  53. CoreManager.Set(CurrentThread.Context.Work);
  54. CurrentThread.Context.Execute();
  55. }
  56. }
  57. }
  58. }