KCoreContext.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Ryujinx.Common;
  2. namespace Ryujinx.HLE.HOS.Kernel.Threading
  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. _scheduler = scheduler;
  16. _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.HostThread);
  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. _coreManager.Set(CurrentThread.HostThread);
  53. CurrentThread.Execute();
  54. }
  55. }
  56. }
  57. }