SystemClockCore.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using System;
  2. using Ryujinx.HLE.HOS.Kernel.Threading;
  3. namespace Ryujinx.HLE.HOS.Services.Time.Clock
  4. {
  5. abstract class SystemClockCore
  6. {
  7. private SteadyClockCore _steadyClockCore;
  8. private SystemClockContext _context;
  9. private bool _isInitialized;
  10. private SystemClockContextUpdateCallback _systemClockContextUpdateCallback;
  11. public SystemClockCore(SteadyClockCore steadyClockCore)
  12. {
  13. _steadyClockCore = steadyClockCore;
  14. _context = new SystemClockContext();
  15. _isInitialized = false;
  16. _context.SteadyTimePoint.ClockSourceId = steadyClockCore.GetClockSourceId();
  17. _systemClockContextUpdateCallback = null;
  18. }
  19. public virtual SteadyClockCore GetSteadyClockCore()
  20. {
  21. return _steadyClockCore;
  22. }
  23. public ResultCode GetCurrentTime(KThread thread, out long posixTime)
  24. {
  25. posixTime = 0;
  26. SteadyClockTimePoint currentTimePoint = _steadyClockCore.GetCurrentTimePoint(thread);
  27. ResultCode result = GetClockContext(thread, out SystemClockContext clockContext);
  28. if (result == ResultCode.Success)
  29. {
  30. result = ResultCode.TimeMismatch;
  31. if (currentTimePoint.ClockSourceId == clockContext.SteadyTimePoint.ClockSourceId)
  32. {
  33. posixTime = clockContext.Offset + currentTimePoint.TimePoint;
  34. result = 0;
  35. }
  36. }
  37. return result;
  38. }
  39. public ResultCode SetCurrentTime(KThread thread, long posixTime)
  40. {
  41. SteadyClockTimePoint currentTimePoint = _steadyClockCore.GetCurrentTimePoint(thread);
  42. SystemClockContext clockContext = new SystemClockContext()
  43. {
  44. Offset = posixTime - currentTimePoint.TimePoint,
  45. SteadyTimePoint = currentTimePoint
  46. };
  47. ResultCode result = SetClockContext(clockContext);
  48. if (result == ResultCode.Success)
  49. {
  50. result = Flush(clockContext);
  51. }
  52. return result;
  53. }
  54. public virtual ResultCode GetClockContext(KThread thread, out SystemClockContext context)
  55. {
  56. context = _context;
  57. return ResultCode.Success;
  58. }
  59. public virtual ResultCode SetClockContext(SystemClockContext context)
  60. {
  61. _context = context;
  62. return ResultCode.Success;
  63. }
  64. protected virtual ResultCode Flush(SystemClockContext context)
  65. {
  66. if (_systemClockContextUpdateCallback == null)
  67. {
  68. return ResultCode.Success;
  69. }
  70. return _systemClockContextUpdateCallback.Update(context);
  71. }
  72. public void SetUpdateCallbackInstance(SystemClockContextUpdateCallback systemClockContextUpdateCallback)
  73. {
  74. _systemClockContextUpdateCallback = systemClockContextUpdateCallback;
  75. }
  76. public void RegisterOperationEvent(KWritableEvent writableEvent)
  77. {
  78. if (_systemClockContextUpdateCallback != null)
  79. {
  80. _systemClockContextUpdateCallback.RegisterOperationEvent(writableEvent);
  81. }
  82. }
  83. public ResultCode SetSystemClockContext(SystemClockContext context)
  84. {
  85. ResultCode result = SetClockContext(context);
  86. if (result == ResultCode.Success)
  87. {
  88. result = Flush(context);
  89. }
  90. return result;
  91. }
  92. public bool IsInitialized()
  93. {
  94. return _isInitialized;
  95. }
  96. public void MarkInitialized()
  97. {
  98. _isInitialized = true;
  99. }
  100. public bool IsClockSetup(KThread thread)
  101. {
  102. ResultCode result = GetClockContext(thread, out SystemClockContext context);
  103. if (result == ResultCode.Success)
  104. {
  105. SteadyClockTimePoint steadyClockTimePoint = _steadyClockCore.GetCurrentTimePoint(thread);
  106. return steadyClockTimePoint.ClockSourceId == context.SteadyTimePoint.ClockSourceId;
  107. }
  108. return false;
  109. }
  110. }
  111. }