KCoreContext.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System;
  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 KThread CurrentThread { get; private set; }
  10. public KThread SelectedThread { get; private set; }
  11. public KCoreContext(KScheduler Scheduler, HleCoreManager CoreManager)
  12. {
  13. this.Scheduler = Scheduler;
  14. this.CoreManager = CoreManager;
  15. }
  16. public void SelectThread(KThread Thread)
  17. {
  18. SelectedThread = Thread;
  19. if (Thread != null)
  20. {
  21. Thread.LastScheduledTicks = (uint)Environment.TickCount;
  22. }
  23. if (SelectedThread != CurrentThread)
  24. {
  25. ContextSwitchNeeded = true;
  26. }
  27. }
  28. public void UpdateCurrentThread()
  29. {
  30. ContextSwitchNeeded = false;
  31. CurrentThread = SelectedThread;
  32. }
  33. public void ContextSwitch()
  34. {
  35. ContextSwitchNeeded = false;
  36. if (CurrentThread != null)
  37. {
  38. CoreManager.GetThread(CurrentThread.Context.Work).Reset();
  39. }
  40. CurrentThread = SelectedThread;
  41. if (CurrentThread != null)
  42. {
  43. CurrentThread.ClearExclusive();
  44. CoreManager.GetThread(CurrentThread.Context.Work).Set();
  45. CurrentThread.Context.Execute();
  46. }
  47. }
  48. }
  49. }