StandardNetworkSystemClockCore.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using Ryujinx.HLE.HOS.Kernel.Threading;
  3. namespace Ryujinx.HLE.HOS.Services.Time.Clock
  4. {
  5. class StandardNetworkSystemClockCore : SystemClockCore
  6. {
  7. private SteadyClockCore _steadyClockCore;
  8. private SystemClockContext _context;
  9. private TimeSpanType _standardNetworkClockSufficientAccuracy;
  10. private static StandardNetworkSystemClockCore instance;
  11. public static StandardNetworkSystemClockCore Instance
  12. {
  13. get
  14. {
  15. if (instance == null)
  16. {
  17. instance = new StandardNetworkSystemClockCore(SteadyClockCore.Instance);
  18. }
  19. return instance;
  20. }
  21. }
  22. public StandardNetworkSystemClockCore(SteadyClockCore steadyClockCore)
  23. {
  24. _steadyClockCore = steadyClockCore;
  25. _context = new SystemClockContext();
  26. _context.SteadyTimePoint.ClockSourceId = steadyClockCore.GetClockSourceId();
  27. _standardNetworkClockSufficientAccuracy = new TimeSpanType(0);
  28. }
  29. public override ResultCode Flush(SystemClockContext context)
  30. {
  31. // TODO: set:sys SetNetworkSystemClockContext
  32. return ResultCode.Success;
  33. }
  34. public override SteadyClockCore GetSteadyClockCore()
  35. {
  36. return _steadyClockCore;
  37. }
  38. public override ResultCode GetSystemClockContext(KThread thread, out SystemClockContext context)
  39. {
  40. context = _context;
  41. return ResultCode.Success;
  42. }
  43. public override ResultCode SetSystemClockContext(SystemClockContext context)
  44. {
  45. _context = context;
  46. return ResultCode.Success;
  47. }
  48. public bool IsStandardNetworkSystemClockAccuracySufficient(KThread thread)
  49. {
  50. SteadyClockCore steadyClockCore = GetSteadyClockCore();
  51. SteadyClockTimePoint currentTimePoint = steadyClockCore.GetCurrentTimePoint(thread);
  52. bool isStandardNetworkClockSufficientAccuracy = false;
  53. if (_context.SteadyTimePoint.GetSpanBetween(currentTimePoint, out long outSpan) == ResultCode.Success)
  54. {
  55. isStandardNetworkClockSufficientAccuracy = outSpan * 1000000000 < _standardNetworkClockSufficientAccuracy.NanoSeconds;
  56. }
  57. return isStandardNetworkClockSufficientAccuracy;
  58. }
  59. public void SetStandardNetworkClockSufficientAccuracy(TimeSpanType standardNetworkClockSufficientAccuracy)
  60. {
  61. _standardNetworkClockSufficientAccuracy = standardNetworkClockSufficientAccuracy;
  62. }
  63. }
  64. }