KCoreContext.cs 1.6 KB

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