aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs40
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;
}
}