diff --git a/Projects/Server/Network/PollGroup/EPollGroup.cs b/Projects/Server/Network/PollGroup/EPollGroup.cs deleted file mode 100755 index bc51526e8..000000000 --- a/Projects/Server/Network/PollGroup/EPollGroup.cs +++ /dev/null @@ -1,197 +0,0 @@ -/************************************************************************* - * ModernUO * - * Copyright 2019-2021 - ModernUO Development Team * - * Email: hi@modernuo.com * - * File: EPollGroup.cs * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - -using System; -using System.Net.Sockets; -using System.Runtime.InteropServices; - -namespace Server.Network -{ - public sealed class EPollGroup : IPollGroup - { - [Flags] - private enum epoll_flags - { - NONE = 0, - CLOEXEC = 0x02000000, - NONBLOCK = 0x04000, - } - - [Flags] - private enum epoll_events : uint - { - EPOLLIN = 0x001, - EPOLLPRI = 0x002, - EPOLLOUT = 0x004, - EPOLLRDNORM = 0x040, - EPOLLRDBAND = 0x080, - EPOLLWRNORM = 0x100, - EPOLLWRBAND = 0x200, - EPOLLMSG = 0x400, - EPOLLERR = 0x008, - EPOLLHUP = 0x010, - EPOLLRDHUP = 0x2000, - EPOLLONESHOT = 1 << 30, - EPOLLET = unchecked((uint)(1 << 31)) - } - - private enum epoll_op - { - EPOLL_CTL_ADD = 1, - EPOLL_CTL_DEL = 2, - EPOLL_CTL_MOD = 3, - } - - [StructLayout(LayoutKind.Explicit, Size = 8)] - private struct epoll_data - { - [FieldOffset(0)] - public int fd; - [FieldOffset(0)] - public IntPtr ptr; - [FieldOffset(0)] - public uint u32; - [FieldOffset(0)] - public ulong u64; - } - - [StructLayout(LayoutKind.Explicit, Pack = 4)] - private struct epoll_event - { - [FieldOffset(0)] - public epoll_events events; - [FieldOffset(4)] - public epoll_data data; - } - - private static class Windows - { - [DllImport("wepoll.dll", SetLastError = true)] - public static extern int epoll_create1(epoll_flags flags); - - [DllImport("wepoll.dll", SetLastError = true)] - public static extern int epoll_close(int epfd); - - [DllImport("wepoll.dll", SetLastError = true)] - public static extern int epoll_ctl(int epfd, epoll_op op, int fd, ref epoll_event ee); - - [DllImport("wepoll.dll", SetLastError = true)] - public static extern int epoll_wait(int epfd, [In, Out] epoll_event[] ee, int maxevents, int timeout); - } - - private static class Linux - { - [DllImport("libc", SetLastError = true)] - public static extern int epoll_create1(epoll_flags flags); - - [DllImport("libc", SetLastError = true)] - public static extern int epoll_close(int epfd); - - [DllImport("libc", SetLastError = true)] - public static extern int epoll_ctl(int epfd, epoll_op op, int fd, ref epoll_event ee); - - [DllImport("libc", SetLastError = true)] - public static extern int epoll_wait(int epfd, [In, Out] epoll_event[] ee, int maxevents, int timeout); - } - - private readonly int _epHndle; - private readonly bool _isWindows; - - public EPollGroup() - { - _isWindows = Core.IsWindows; - _epHndle = _isWindows ? Windows.epoll_create1(epoll_flags.NONE) : Linux.epoll_create1(epoll_flags.NONE); - - if (_epHndle == 0) - { - throw new Exception("Unable to initialize poll group"); - } - } - - public void Dispose() - { - if (_isWindows) - { - Windows.epoll_close(_epHndle); - } - else - { - Linux.epoll_close(_epHndle); - } - } - - public void Add(Socket socket, GCHandle handle) - { - var ev = new epoll_event - { - events = epoll_events.EPOLLIN | epoll_events.EPOLLERR - }; - - ev.data.ptr = (IntPtr)handle; - - var rc = _isWindows ? - Windows.epoll_ctl(_epHndle, epoll_op.EPOLL_CTL_ADD, (int)socket.Handle, ref ev) : - Linux.epoll_ctl(_epHndle, epoll_op.EPOLL_CTL_ADD, (int)socket.Handle, ref ev); - - - if (rc != 0) - { - throw new Exception($"epoll_ctl failed with error code {Marshal.GetLastWin32Error()}"); - } - } - - public void Remove(Socket socket) - { - var ev = new epoll_event { events = epoll_events.EPOLLIN | epoll_events.EPOLLERR }; - - var rc = _isWindows ? - Windows.epoll_ctl(_epHndle, epoll_op.EPOLL_CTL_DEL, (int)socket.Handle, ref ev) : - Linux.epoll_ctl(_epHndle, epoll_op.EPOLL_CTL_DEL, (int)socket.Handle, ref ev); - - if (rc != 0) - { - throw new Exception($"epoll_ctl failed with error code {Marshal.GetLastWin32Error()}"); - } - } - - private epoll_event[] _events = new epoll_event[2048]; - - public int Poll(ref GCHandle[] handles) - { - if (handles.Length > _events.Length) - { - var newLength = Math.Max(handles.Length, _events.Length + (_events.Length >> 2)); - _events = new epoll_event[newLength]; - } - - var rc = _isWindows ? - Windows.epoll_wait(_epHndle, _events, handles.Length, 0) : - Linux.epoll_wait(_epHndle, _events, handles.Length, 0); - - if (rc <= 0) - { - return rc; - } - - for (int i = 0; i < rc; i++) - { - handles[i] = (GCHandle)_events[i].data.ptr; - } - - return rc; - } - - } -} diff --git a/Projects/Server/Network/PollGroup/KQueuePollGroup.cs b/Projects/Server/Network/PollGroup/KQueuePollGroup.cs deleted file mode 100644 index 278e88406..000000000 --- a/Projects/Server/Network/PollGroup/KQueuePollGroup.cs +++ /dev/null @@ -1,241 +0,0 @@ -/************************************************************************* - * ModernUO * - * Copyright 2019-2021 - ModernUO Development Team * - * Email: hi@modernuo.com * - * File: KQueuePollGroup.cs * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - -using System; -using System.IO; -using System.Net.Sockets; -using System.Runtime.InteropServices; - -namespace Server.Network -{ - public class KQueuePollGroup : IPollGroup - { - [StructLayout(LayoutKind.Sequential)] - private struct kevent - { - public IntPtr ident; - public kqueue_filter filter; - public kqueue_flags flags; - public kqueue_fflags fflags; - public IntPtr data; - public IntPtr udata; - } - - [Flags] - private enum kqueue_filter : short - { - READ = -1, - WRITE = -2, - AIO = -3, - VNODE = -4, - PROC = -5, - SIGNAL = -6, - TIMER = -7, - MACHPORT = -8, - FS = -9, - USER = -10, - UNUSED = -11, - VM = -12, - EXCEPT = -15 - } - - [Flags] - private enum kqueue_flags : ushort - { - ADD = 0x0001, - DELETE = 0x0002, - ENABLE = 0x0004, - DISABLE = 0x0008, - ONESHOT = 0x0010, - CLEAR = 0x0020, - RECEIPT = 0x0040, - DISPATCH = 0x0080, - UDATA_SPECIFIC = 0x0100, - DISPATCH2 = (DISPATCH | UDATA_SPECIFIC), - VANISHED = 0x0200, - SYSFLAGS = 0xF000, - FLAG0 = 0x1000, - FLAG1 = 0x2000, - EOF = 0x8000, - ERROR = 0x4000 - } - - [Flags] - private enum kqueue_fflags : uint - { - TRIGGER = 0x01000000, - FFNOP = 0x00000000, - FFAND = 0x40000000, - FFOR = 0x80000000, - FFCOPY = 0xc0000000, - FFCTRLMASK = 0xc0000000, - FFFLAGSMASK = 0x00ffffff, - LOWAT = 0x00000001, - DELETE = 0x00000001, - WRITE = 0x00000002, - EXTEND = 0x00000004, - ATTRIB = 0x00000008, - LINK = 0x00000010, - RENAME = 0x00000020, - REVOKE = 0x00000040, - NONE = 0x00000080, - } - - [StructLayout(LayoutKind.Sequential)] - struct timespec - { - public long tv_sec; - public long tv_nsec; - - public timespec(long sec, long nsec) - { - tv_sec = sec; - tv_nsec = nsec; - } - } - - private static readonly kevent[] _singleEvent = new kevent[1]; - private static readonly IntPtr _zeroTimeoutPtr; - // ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable - private static readonly timespec _zeroTimeout; - - static KQueuePollGroup() - { - _zeroTimeout = new timespec(0, 0); - _zeroTimeoutPtr = Marshal.AllocHGlobal(Marshal.SizeOf()); - Marshal.StructureToPtr(_zeroTimeout, _zeroTimeoutPtr, false); - } - - private static class BSD - { - [DllImport ("libc", SetLastError = true)] - public static extern int close (int fd); - - [DllImport("libc", SetLastError = true)] - public static extern int kqueue(); - - [DllImport("libc", SetLastError = true)] - public static extern int kevent(int kq, kevent[] changelist, int nchanges, [In, Out] kevent[] eventlist, int nevents, IntPtr timeout); - - public static int kevent( - int kq, - IntPtr ident, - kqueue_filter filter, - kqueue_flags flags, - kqueue_fflags fflags = 0, - IntPtr data = default, - IntPtr udata = default - ) - { - _singleEvent[0] = new kevent - { - ident = ident, - filter = filter, - flags = flags, - fflags = fflags, - data = data, - udata = udata - }; - - var rc = kevent(kq, _singleEvent, 1, null, 0, _zeroTimeoutPtr); - if (rc != 0) - { - throw new Exception($"kqueue failed to {flags} with error code {Marshal.GetLastWin32Error()}"); - } - - if (_singleEvent[0].flags.HasFlag(kqueue_flags.ERROR)) - { - throw new IOException($"kqueue failed to {flags} with error {_singleEvent[0].data}"); - } - - return rc; - } - } - - private readonly int _kqueueHndle; - - public KQueuePollGroup() - { - _kqueueHndle = BSD.kqueue(); - - if (_kqueueHndle == 0) - { - throw new Exception("Unable to initialize poll group"); - } - } - - public void Dispose() - { - BSD.close(_kqueueHndle); - Marshal.FreeHGlobal(_zeroTimeoutPtr); - } - - public void Add(Socket socket, GCHandle handle) - { - var rc = BSD.kevent( - _kqueueHndle, - socket.Handle, - kqueue_filter.READ | kqueue_filter.WRITE, - kqueue_flags.ADD | kqueue_flags.CLEAR, - udata: (IntPtr)handle - ); - - if (rc != 0) - { - throw new Exception($"kevent failed with error code {Marshal.GetLastWin32Error()}"); - } - } - - public void Remove(Socket socket) - { - var rc = BSD.kevent( - _kqueueHndle, - socket.Handle, - kqueue_filter.READ | kqueue_filter.WRITE, - kqueue_flags.DELETE - ); - - if (rc != 0) - { - throw new Exception($"kevent failed with error code {Marshal.GetLastWin32Error()}"); - } - } - - private kevent[] _events = new kevent[2048]; - - public int Poll(ref GCHandle[] handles) - { - if (handles.Length > _events.Length) - { - var newLength = Math.Max(handles.Length, _events.Length + (_events.Length >> 2)); - _events = new kevent[newLength]; - } - - var rc = BSD.kevent(_kqueueHndle, null, 0, _events, _events.Length, _zeroTimeoutPtr); - - if (rc <= 0) - { - return rc; - } - - for (int i = 0; i < rc; i++) - { - handles[i] = (GCHandle)_events[i].udata; - } - - return rc; - } - } -} diff --git a/Projects/Server/Network/PollGroup/PollGroup.cs b/Projects/Server/Network/PollGroup/PollGroup.cs deleted file mode 100644 index 0fa4fa875..000000000 --- a/Projects/Server/Network/PollGroup/PollGroup.cs +++ /dev/null @@ -1,41 +0,0 @@ -/************************************************************************* - * ModernUO * - * Copyright 2019-2021 - ModernUO Development Team * - * Email: hi@modernuo.com * - * File: PollGroup.cs * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - -using System; -using System.Net.Sockets; -using System.Runtime.InteropServices; - -namespace Server.Network -{ - public interface IPollGroup : IDisposable - { - void Add(Socket sock, GCHandle handle); - void Remove(Socket sock); - int Poll(ref GCHandle[] handles); - } - - public static class PollGroup - { - public static IPollGroup Create() - { - if (Core.IsBSD) - { - return new KQueuePollGroup(); - } - - return new EPollGroup(); - } - } -} diff --git a/Projects/Server/Server.csproj b/Projects/Server/Server.csproj index a0d4042b7..031478398 100755 --- a/Projects/Server/Server.csproj +++ b/Projects/Server/Server.csproj @@ -13,32 +13,29 @@ - - - - - - - - + - - + + + + + + + + + + + - - - Always - Always - - + diff --git a/Projects/Server/wepoll.dll b/Projects/Server/wepoll.dll deleted file mode 100644 index f9383691d..000000000 Binary files a/Projects/Server/wepoll.dll and /dev/null differ