diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs')
| -rw-r--r-- | Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs index 239e2434..f84e9b93 100644 --- a/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs +++ b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs @@ -26,8 +26,9 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd _value = value; _flags = flags; - WriteEvent = new ManualResetEvent(true); - ReadEvent = new ManualResetEvent(true); + WriteEvent = new ManualResetEvent(false); + ReadEvent = new ManualResetEvent(false); + UpdateEventStates(); } public int Refcount { get; set; } @@ -38,6 +39,25 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd ReadEvent.Dispose(); } + private void ResetEventStates() + { + WriteEvent.Reset(); + ReadEvent.Reset(); + } + + private void UpdateEventStates() + { + if (_value > 0) + { + ReadEvent.Set(); + } + + if (_value != uint.MaxValue - 1) + { + WriteEvent.Set(); + } + } + public LinuxError Read(out int readSize, Span<byte> buffer) { if (buffer.Length < sizeof(ulong)) @@ -47,10 +67,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd return LinuxError.EINVAL; } - ReadEvent.Reset(); - lock (_lock) { + ResetEventStates(); + ref ulong count = ref MemoryMarshal.Cast<byte, ulong>(buffer)[0]; if (_value == 0) @@ -66,6 +86,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd { readSize = 0; + UpdateEventStates(); return LinuxError.EAGAIN; } } @@ -85,8 +106,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd _value = 0; } - ReadEvent.Set(); - + UpdateEventStates(); return LinuxError.SUCCESS; } } @@ -100,10 +120,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd return LinuxError.EINVAL; } - WriteEvent.Reset(); - lock (_lock) { + ResetEventStates(); + if (_value > _value + count) { if (Blocking) @@ -114,6 +134,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd { writeSize = 0; + UpdateEventStates(); return LinuxError.EAGAIN; } } @@ -123,8 +144,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd _value += count; Monitor.Pulse(_lock); - WriteEvent.Set(); - + UpdateEventStates(); return LinuxError.SUCCESS; } } |
