SteadyClockCore.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using Ryujinx.HLE.HOS.Kernel.Threading;
  2. using Ryujinx.HLE.Utilities;
  3. using System;
  4. namespace Ryujinx.HLE.HOS.Services.Time.Clock
  5. {
  6. class SteadyClockCore
  7. {
  8. private TimeSpanType _testOffset;
  9. private TimeSpanType _internalOffset;
  10. private UInt128 _clockSourceId;
  11. private static SteadyClockCore instance;
  12. public static SteadyClockCore Instance
  13. {
  14. get
  15. {
  16. if (instance == null)
  17. {
  18. instance = new SteadyClockCore();
  19. }
  20. return instance;
  21. }
  22. }
  23. private SteadyClockCore()
  24. {
  25. _testOffset = new TimeSpanType(0);
  26. _internalOffset = new TimeSpanType(0);
  27. _clockSourceId = new UInt128(Guid.NewGuid().ToByteArray());
  28. }
  29. private SteadyClockTimePoint GetTimePoint(KThread thread)
  30. {
  31. SteadyClockTimePoint result = new SteadyClockTimePoint
  32. {
  33. TimePoint = 0,
  34. ClockSourceId = _clockSourceId
  35. };
  36. TimeSpanType ticksTimeSpan = TimeSpanType.FromTicks(thread.Context.ThreadState.CntpctEl0, thread.Context.ThreadState.CntfrqEl0);
  37. result.TimePoint = _internalOffset.ToSeconds() + ticksTimeSpan.ToSeconds();
  38. return result;
  39. }
  40. public UInt128 GetClockSourceId()
  41. {
  42. return _clockSourceId;
  43. }
  44. public SteadyClockTimePoint GetCurrentTimePoint(KThread thread)
  45. {
  46. SteadyClockTimePoint result = GetTimePoint(thread);
  47. result.TimePoint += _testOffset.ToSeconds();
  48. return result;
  49. }
  50. public TimeSpanType GetTestOffset()
  51. {
  52. return _testOffset;
  53. }
  54. public void SetTestOffset(TimeSpanType testOffset)
  55. {
  56. _testOffset = testOffset;
  57. }
  58. // TODO: check if this is accurate
  59. public TimeSpanType GetInternalOffset()
  60. {
  61. return _internalOffset;
  62. }
  63. // TODO: check if this is accurate
  64. public void SetInternalOffset(TimeSpanType internalOffset)
  65. {
  66. _internalOffset = internalOffset;
  67. }
  68. }
  69. }