aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocketPollManager.cs
diff options
context:
space:
mode:
authorTSRBerry <20988865+TSRBerry@users.noreply.github.com>2022-12-12 14:59:31 +0100
committerGitHub <noreply@github.com>2022-12-12 14:59:31 +0100
commitba5c0cf5d8e4ea27fc62cd181ef65b8ff39f0fd5 (patch)
tree0c4de86156dbc4cf585130ee786efba697224dbd /Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocketPollManager.cs
parent403e67d9835b7412022ff4d98685f83590641c88 (diff)
Bsd: Implement Select (#4017)
* bsd: Add gdkchan's Select implementation Co-authored-by: TSRBerry <20988865+tsrberry@users.noreply.github.com> * bsd: Fix Select() causing a crash with an ArgumentException .NET Sockets have to be used for the Select() call * bsd: Make Select more generic * bsd: Adjust namespaces and remove unused imports * bsd: Fix NullReferenceException in Select Co-authored-by: gdkchan <gab.dark.100@gmail.com>
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocketPollManager.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocketPollManager.cs60
1 files changed, 58 insertions, 2 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocketPollManager.cs b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocketPollManager.cs
index 31d93cad..1b305dfb 100644
--- a/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocketPollManager.cs
+++ b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocketPollManager.cs
@@ -1,8 +1,9 @@
using Ryujinx.Common.Logging;
+using Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types;
using System.Collections.Generic;
using System.Net.Sockets;
-namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
+namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl
{
class ManagedSocketPollManager : IPollManager
{
@@ -117,5 +118,60 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
return LinuxError.SUCCESS;
}
+
+ public LinuxError Select(List<PollEvent> events, int timeout, out int updatedCount)
+ {
+ List<Socket> readEvents = new();
+ List<Socket> writeEvents = new();
+ List<Socket> errorEvents = new();
+
+ updatedCount = 0;
+
+ foreach (PollEvent pollEvent in events)
+ {
+ ManagedSocket socket = (ManagedSocket)pollEvent.FileDescriptor;
+
+ if (pollEvent.Data.InputEvents.HasFlag(PollEventTypeMask.Input))
+ {
+ readEvents.Add(socket.Socket);
+ }
+
+ if (pollEvent.Data.InputEvents.HasFlag(PollEventTypeMask.Output))
+ {
+ writeEvents.Add(socket.Socket);
+ }
+
+ if (pollEvent.Data.InputEvents.HasFlag(PollEventTypeMask.Error))
+ {
+ errorEvents.Add(socket.Socket);
+ }
+ }
+
+ Socket.Select(readEvents, writeEvents, errorEvents, timeout);
+
+ updatedCount = readEvents.Count + writeEvents.Count + errorEvents.Count;
+
+ foreach (PollEvent pollEvent in events)
+ {
+ ManagedSocket socket = (ManagedSocket)pollEvent.FileDescriptor;
+
+ if (readEvents.Contains(socket.Socket))
+ {
+ pollEvent.Data.OutputEvents |= PollEventTypeMask.Input;
+ }
+
+ if (writeEvents.Contains(socket.Socket))
+ {
+ pollEvent.Data.OutputEvents |= PollEventTypeMask.Output;
+ }
+
+ if (errorEvents.Contains(socket.Socket))
+ {
+ pollEvent.Data.OutputEvents |= PollEventTypeMask.Error;
+ }
+ }
+
+ return LinuxError.SUCCESS;
+ }
}
-}
+} \ No newline at end of file