SystemClockContextUpdateCallback.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using Ryujinx.HLE.HOS.Kernel.Threading;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Threading;
  5. namespace Ryujinx.HLE.HOS.Services.Time.Clock
  6. {
  7. abstract class SystemClockContextUpdateCallback
  8. {
  9. private List<KWritableEvent> _operationEventList;
  10. protected SystemClockContext _context;
  11. private bool _hasContext;
  12. public SystemClockContextUpdateCallback()
  13. {
  14. _operationEventList = new List<KWritableEvent>();
  15. _context = new SystemClockContext();
  16. _hasContext = false;
  17. }
  18. private bool NeedUpdate(SystemClockContext context)
  19. {
  20. if (_hasContext)
  21. {
  22. return _context.Offset != context.Offset || _context.SteadyTimePoint.ClockSourceId != context.SteadyTimePoint.ClockSourceId;
  23. }
  24. return true;
  25. }
  26. public void RegisterOperationEvent(KWritableEvent writableEvent)
  27. {
  28. Monitor.Enter(_operationEventList);
  29. _operationEventList.Add(writableEvent);
  30. Monitor.Exit(_operationEventList);
  31. }
  32. private void BroadcastOperationEvent()
  33. {
  34. Monitor.Enter(_operationEventList);
  35. foreach (KWritableEvent e in _operationEventList)
  36. {
  37. e.Signal();
  38. }
  39. Monitor.Exit(_operationEventList);
  40. }
  41. protected abstract ResultCode Update();
  42. public ResultCode Update(SystemClockContext context)
  43. {
  44. ResultCode result = ResultCode.Success;
  45. if (NeedUpdate(context))
  46. {
  47. _context = context;
  48. _hasContext = true;
  49. result = Update();
  50. if (result == ResultCode.Success)
  51. {
  52. BroadcastOperationEvent();
  53. }
  54. }
  55. return result;
  56. }
  57. }
  58. }