StandardNetworkSystemClockCore.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using Ryujinx.HLE.HOS.Kernel.Threading;
  2. namespace Ryujinx.HLE.HOS.Services.Time.Clock
  3. {
  4. class StandardNetworkSystemClockCore : SystemClockCore
  5. {
  6. private TimeSpanType _standardNetworkClockSufficientAccuracy;
  7. private static StandardNetworkSystemClockCore _instance;
  8. public static StandardNetworkSystemClockCore Instance
  9. {
  10. get
  11. {
  12. if (_instance == null)
  13. {
  14. _instance = new StandardNetworkSystemClockCore(StandardSteadyClockCore.Instance);
  15. }
  16. return _instance;
  17. }
  18. }
  19. public StandardNetworkSystemClockCore(StandardSteadyClockCore steadyClockCore) : base(steadyClockCore)
  20. {
  21. _standardNetworkClockSufficientAccuracy = new TimeSpanType(0);
  22. }
  23. public override ResultCode Flush(SystemClockContext context)
  24. {
  25. // TODO: set:sys SetNetworkSystemClockContext
  26. return ResultCode.Success;
  27. }
  28. public bool IsStandardNetworkSystemClockAccuracySufficient(KThread thread)
  29. {
  30. SteadyClockCore steadyClockCore = GetSteadyClockCore();
  31. SteadyClockTimePoint currentTimePoint = steadyClockCore.GetCurrentTimePoint(thread);
  32. bool isStandardNetworkClockSufficientAccuracy = false;
  33. ResultCode result = GetSystemClockContext(thread, out SystemClockContext context);
  34. if (result == ResultCode.Success && context.SteadyTimePoint.GetSpanBetween(currentTimePoint, out long outSpan) == ResultCode.Success)
  35. {
  36. isStandardNetworkClockSufficientAccuracy = outSpan * 1000000000 < _standardNetworkClockSufficientAccuracy.NanoSeconds;
  37. }
  38. return isStandardNetworkClockSufficientAccuracy;
  39. }
  40. public void SetStandardNetworkClockSufficientAccuracy(TimeSpanType standardNetworkClockSufficientAccuracy)
  41. {
  42. _standardNetworkClockSufficientAccuracy = standardNetworkClockSufficientAccuracy;
  43. }
  44. }
  45. }