SystemClockContextUpdateCallback.cs 1.9 KB

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