KReadableEvent.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using Ryujinx.HLE.HOS.Kernel.Common;
  2. using Ryujinx.Horizon.Common;
  3. namespace Ryujinx.HLE.HOS.Kernel.Threading
  4. {
  5. class KReadableEvent : KSynchronizationObject
  6. {
  7. private readonly KEvent _parent;
  8. private bool _signaled;
  9. public KReadableEvent(KernelContext context, KEvent parent) : base(context)
  10. {
  11. _parent = parent;
  12. }
  13. public override void Signal()
  14. {
  15. KernelContext.CriticalSection.Enter();
  16. if (!_signaled)
  17. {
  18. _signaled = true;
  19. base.Signal();
  20. }
  21. KernelContext.CriticalSection.Leave();
  22. }
  23. public Result Clear()
  24. {
  25. _signaled = false;
  26. return Result.Success;
  27. }
  28. public Result ClearIfSignaled()
  29. {
  30. Result result;
  31. KernelContext.CriticalSection.Enter();
  32. if (_signaled)
  33. {
  34. _signaled = false;
  35. result = Result.Success;
  36. }
  37. else
  38. {
  39. result = KernelResult.InvalidState;
  40. }
  41. KernelContext.CriticalSection.Leave();
  42. return result;
  43. }
  44. public override bool IsSignaled()
  45. {
  46. return _signaled;
  47. }
  48. }
  49. }