KCoreContext.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. ContextSwitchNeeded = true;
  24. }
  25. public void UpdateCurrentThread()
  26. {
  27. ContextSwitchNeeded = false;
  28. CurrentThread = SelectedThread;
  29. }
  30. public void ContextSwitch()
  31. {
  32. ContextSwitchNeeded = false;
  33. if (CurrentThread != null)
  34. {
  35. CoreManager.GetThread(CurrentThread.Context.Work).Reset();
  36. }
  37. CurrentThread = SelectedThread;
  38. if (CurrentThread != null)
  39. {
  40. CurrentThread.ClearExclusive();
  41. CoreManager.GetThread(CurrentThread.Context.Work).Set();
  42. CurrentThread.Context.Execute();
  43. }
  44. }
  45. public void RemoveThread(KThread Thread)
  46. {
  47. //TODO.
  48. }
  49. }
  50. }