From f3b722b9d6e2757c22b6d9857cbc89e12c033e81 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Tue, 5 Oct 2021 20:06:00 -0700 Subject: [PATCH 1/9] fix: Fixes epoll calls on linux (#818) --- Projects/Server/Network/PollGroup/EPollGroup.cs | 8 ++++---- Projects/UOContent/World Saves/AutoArchive.cs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Projects/Server/Network/PollGroup/EPollGroup.cs b/Projects/Server/Network/PollGroup/EPollGroup.cs index bf615e4cc..ff00b44b2 100755 --- a/Projects/Server/Network/PollGroup/EPollGroup.cs +++ b/Projects/Server/Network/PollGroup/EPollGroup.cs @@ -93,16 +93,16 @@ namespace Server.Network private static class Linux { - [DllImport("libc", SetLastError = true)] + [DllImport("libc.so.6", SetLastError = true)] public static extern int epoll_create1(epoll_flags flags); - [DllImport("libc", SetLastError = true)] + [DllImport("libc.so.6", SetLastError = true)] public static extern int epoll_close(int epfd); - [DllImport("libc", SetLastError = true)] + [DllImport("libc.so.6", SetLastError = true)] public static extern int epoll_ctl(int epfd, epoll_op op, int fd, ref epoll_event ee); - [DllImport("libc", SetLastError = true)] + [DllImport("libc.so.6", SetLastError = true)] public static extern int epoll_wait(int epfd, [In, Out] epoll_event[] ee, int maxevents, int timeout); } diff --git a/Projects/UOContent/World Saves/AutoArchive.cs b/Projects/UOContent/World Saves/AutoArchive.cs index fc839e830..ed4dd4afd 100755 --- a/Projects/UOContent/World Saves/AutoArchive.cs +++ b/Projects/UOContent/World Saves/AutoArchive.cs @@ -380,7 +380,7 @@ namespace Server.Saves private static IEnumerable PathsByTimestampName(string path, bool files = false) { - var allItems = files ? Directory.GetFiles(path) : Directory.GetDirectories(path); + var allItems = files ? Directory.EnumerateFiles(path) : Directory.GetDirectories(path); var items = new SortedDictionary(new DescendingComparer()); foreach (var item in allItems) { From 05ff3f2ad9d900714298df24b4cec73a307d6b16 Mon Sep 17 00:00:00 2001 From: Jabin <1094679+jabinb@users.noreply.github.com> Date: Thu, 7 Oct 2021 01:45:05 +1100 Subject: [PATCH 2/9] Fix: epoll on linux (#820) --- Projects/Server/Network/PollGroup/EPollGroup.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Projects/Server/Network/PollGroup/EPollGroup.cs b/Projects/Server/Network/PollGroup/EPollGroup.cs index ff00b44b2..60b8d594f 100755 --- a/Projects/Server/Network/PollGroup/EPollGroup.cs +++ b/Projects/Server/Network/PollGroup/EPollGroup.cs @@ -69,10 +69,12 @@ namespace Server.Network public ulong u64; } - [StructLayout(LayoutKind.Sequential)] + [StructLayout(LayoutKind.Explicit)] private struct epoll_event { + [FieldOffset(0)] public epoll_events events; + [FieldOffset(4)] public epoll_data data; } @@ -93,16 +95,16 @@ namespace Server.Network private static class Linux { - [DllImport("libc.so.6", SetLastError = true)] + [DllImport("libc", SetLastError = true)] public static extern int epoll_create1(epoll_flags flags); - [DllImport("libc.so.6", SetLastError = true)] + [DllImport("libc", SetLastError = true)] public static extern int epoll_close(int epfd); - [DllImport("libc.so.6", SetLastError = true)] + [DllImport("libc", SetLastError = true)] public static extern int epoll_ctl(int epfd, epoll_op op, int fd, ref epoll_event ee); - [DllImport("libc.so.6", SetLastError = true)] + [DllImport("libc", SetLastError = true)] public static extern int epoll_wait(int epfd, [In, Out] epoll_event[] ee, int maxevents, int timeout); } From 81486772f63e3c9db30a6ddb250a194da90566f7 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sat, 9 Oct 2021 11:55:31 -0700 Subject: [PATCH 3/9] fix: Fixes networking (#822) * Fixes wepoll to be POSIX compliant. --- .../Helpers/PacketTestUtilities.cs | 18 +--- .../Packets/Outgoing/LightPacketTests.cs | 2 +- Projects/Server/Network/NetState/NetState.cs | 14 ++-- Projects/Server/Network/NetworkSocket.cs | 77 ------------------ .../Server/Network/PollGroup/EPollGroup.cs | 61 ++++++-------- .../Network/PollGroup/KQueuePollGroup.cs | 31 +++---- .../Server/Network/PollGroup/PollGroup.cs | 8 +- Projects/Server/Network/TcpServer.cs | 2 +- Projects/Server/wepoll.dll | Bin 21504 -> 21504 bytes Projects/UOContent/Misc/ServerList.cs | 8 +- 10 files changed, 60 insertions(+), 161 deletions(-) delete mode 100644 Projects/Server/Network/NetworkSocket.cs diff --git a/Projects/Server.Tests/Helpers/PacketTestUtilities.cs b/Projects/Server.Tests/Helpers/PacketTestUtilities.cs index b90c457e9..afcbc6423 100644 --- a/Projects/Server.Tests/Helpers/PacketTestUtilities.cs +++ b/Projects/Server.Tests/Helpers/PacketTestUtilities.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.Net.Sockets; -using Moq; using Server.Network; namespace Server.Tests.Network @@ -11,18 +9,8 @@ namespace Server.Tests.Network public static Span Compile(this Packet p) => p.Compile(false, out var length).AsSpan(0, length); - public static NetState CreateTestNetState() - { - var socket = new Mock(); - socket - .Setup(s => s.SendAsync(It.IsAny>>(), SocketFlags.None)) - .ReturnsAsync(() => 0); - - socket - .Setup(s => s.ReceiveAsync(It.IsAny>>(), SocketFlags.None)) - .ReturnsAsync(() => 0); - - return new NetState(socket.Object); - } + public static NetState CreateTestNetState() => new( + new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + ); } } diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/LightPacketTests.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/LightPacketTests.cs index 36e79adf9..a6eb94b47 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/LightPacketTests.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/LightPacketTests.cs @@ -9,7 +9,7 @@ namespace Server.Tests.Network [Fact] public void TestGlobalLightLevel() { - byte lightLevel = 5; + const byte lightLevel = 5; var expected = new GlobalLightLevel(lightLevel).Compile(); var ns = PacketTestUtilities.CreateTestNetState(); diff --git a/Projects/Server/Network/NetState/NetState.cs b/Projects/Server/Network/NetState/NetState.cs index 136b84320..a1104a6f8 100755 --- a/Projects/Server/Network/NetState/NetState.cs +++ b/Projects/Server/Network/NetState/NetState.cs @@ -48,7 +48,7 @@ namespace Server.Network private const int MenuCap = 512; private const int PacketPerSecondThreshold = 3000; - private static NetState[] _polledStates = new NetState[2048]; + private static GCHandle[] _polledStates = new GCHandle[2048]; private static readonly IPollGroup _pollGroup = PollGroup.Create(); private static readonly Queue FlushPending = new(2048); private static readonly Queue FlushedPartials = new(2048); @@ -101,7 +101,7 @@ namespace Server.Network Timer.DelayCall(TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1.5), CheckAllAlive); } - public NetState(ISocket connection) + public NetState(Socket connection) { Connection = connection; Seeded = false; @@ -130,7 +130,7 @@ namespace Server.Network try { - _pollGroup.Add(this); + _pollGroup.Add(connection, _handle); } catch (Exception ex) { @@ -171,7 +171,7 @@ namespace Server.Network public Pipe SendPipe { get; } - public ISocket Connection { get; } + public Socket Connection { get; } public bool CompressionEnabled { get; set; } @@ -885,8 +885,8 @@ namespace Server.Network { for (int i = 0; i < count; i++) { - _polledStates[i].HandleReceive(); - _polledStates[i] = null; + (_polledStates[i].Target as NetState)?.HandleReceive(); + _polledStates[i] = default; } } @@ -1032,7 +1032,7 @@ namespace Server.Network TcpServer.Instances.Remove(this); try { - _pollGroup.Remove(this); + _pollGroup.Remove(Connection); } catch (Exception ex) { diff --git a/Projects/Server/Network/NetworkSocket.cs b/Projects/Server/Network/NetworkSocket.cs deleted file mode 100644 index f762ba1cf..000000000 --- a/Projects/Server/Network/NetworkSocket.cs +++ /dev/null @@ -1,77 +0,0 @@ -/************************************************************************* - * ModernUO * - * Copyright 2019-2020 - ModernUO Development Team * - * Email: hi@modernuo.com * - * File: NetworkSocket.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.Collections.Generic; -using System.Net; -using System.Net.Sockets; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; - -namespace Server.Network -{ - public class NetworkSocket : ISocket - { - private readonly Socket _connection; - - public Socket Connection - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => _connection; - } - - public IntPtr Handle - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => _connection.Handle; - } - - public EndPoint LocalEndPoint - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => _connection.LocalEndPoint; - } - - public EndPoint RemoteEndPoint - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => _connection.RemoteEndPoint; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public NetworkSocket(Socket connection) => _connection = connection; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Task SendAsync(IList> buffers, SocketFlags flags) => - _connection.SendAsync(buffers, flags); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Send(IList> buffers, SocketFlags flags) => _connection.Send(buffers, flags); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Task ReceiveAsync(IList> buffers, SocketFlags flags) => - _connection.ReceiveAsync(buffers, flags); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Receive(IList> buffers, SocketFlags flags) => - _connection.Receive(buffers, flags); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Shutdown(SocketShutdown how) => _connection.Shutdown(how); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Close() => _connection.Close(); - } -} diff --git a/Projects/Server/Network/PollGroup/EPollGroup.cs b/Projects/Server/Network/PollGroup/EPollGroup.cs index 60b8d594f..bc51526e8 100755 --- a/Projects/Server/Network/PollGroup/EPollGroup.cs +++ b/Projects/Server/Network/PollGroup/EPollGroup.cs @@ -14,6 +14,7 @@ *************************************************************************/ using System; +using System.Net.Sockets; using System.Runtime.InteropServices; namespace Server.Network @@ -53,23 +54,20 @@ namespace Server.Network EPOLL_CTL_MOD = 3, } - [StructLayout(LayoutKind.Explicit)] + [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)] + [StructLayout(LayoutKind.Explicit, Pack = 4)] private struct epoll_event { [FieldOffset(0)] @@ -109,10 +107,12 @@ namespace Server.Network } private readonly int _epHndle; + private readonly bool _isWindows; public EPollGroup() { - _epHndle = Core.IsWindows ? Windows.epoll_create1(epoll_flags.NONE) : Linux.epoll_create1(epoll_flags.NONE); + _isWindows = Core.IsWindows; + _epHndle = _isWindows ? Windows.epoll_create1(epoll_flags.NONE) : Linux.epoll_create1(epoll_flags.NONE); if (_epHndle == 0) { @@ -122,7 +122,7 @@ namespace Server.Network public void Dispose() { - if (Core.IsWindows) + if (_isWindows) { Windows.epoll_close(_epHndle); } @@ -132,18 +132,18 @@ namespace Server.Network } } - public void Add(NetState state) + public void Add(Socket socket, GCHandle handle) { var ev = new epoll_event { events = epoll_events.EPOLLIN | epoll_events.EPOLLERR }; - ev.data.ptr = (IntPtr)state._handle; + ev.data.ptr = (IntPtr)handle; - var rc = Core.IsWindows ? - Windows.epoll_ctl(_epHndle, epoll_op.EPOLL_CTL_ADD, (int)state.Connection.Handle, ref ev) : - Linux.epoll_ctl(_epHndle, epoll_op.EPOLL_CTL_ADD, (int)state.Connection.Handle, ref ev); + 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) @@ -152,17 +152,13 @@ namespace Server.Network } } - public void Remove(NetState state) + public void Remove(Socket socket) { - var ev = new epoll_event - { - events = epoll_events.EPOLLIN | epoll_events.EPOLLERR, - }; - ev.data.ptr = (IntPtr)state._handle; + var ev = new epoll_event { events = epoll_events.EPOLLIN | epoll_events.EPOLLERR }; - var rc = Core.IsWindows ? - Windows.epoll_ctl(_epHndle, epoll_op.EPOLL_CTL_DEL, (int)state.Connection.Handle, ref ev) : - Linux.epoll_ctl(_epHndle, epoll_op.EPOLL_CTL_DEL, (int)state.Connection.Handle, ref ev); + 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) { @@ -172,36 +168,29 @@ namespace Server.Network private epoll_event[] _events = new epoll_event[2048]; - public int Poll(ref NetState[] states) + public int Poll(ref GCHandle[] handles) { - if (states.Length > _events.Length) + if (handles.Length > _events.Length) { - var newLength = Math.Max(states.Length, _events.Length + (_events.Length >> 2)); + var newLength = Math.Max(handles.Length, _events.Length + (_events.Length >> 2)); _events = new epoll_event[newLength]; } - var rc = Core.IsWindows ? - Windows.epoll_wait(_epHndle, _events, states.Length, 0) : - Linux.epoll_wait(_epHndle, _events, states.Length, 0); + var rc = _isWindows ? + Windows.epoll_wait(_epHndle, _events, handles.Length, 0) : + Linux.epoll_wait(_epHndle, _events, handles.Length, 0); if (rc <= 0) { return rc; } - int count = 0; - for (int i = 0; i < rc; i++) { - if (((GCHandle)_events[i].data.ptr).Target is not NetState state) - { - continue; - } - - states[count++] = state; + handles[i] = (GCHandle)_events[i].data.ptr; } - return count; + return rc; } } diff --git a/Projects/Server/Network/PollGroup/KQueuePollGroup.cs b/Projects/Server/Network/PollGroup/KQueuePollGroup.cs index 41466b968..278e88406 100644 --- a/Projects/Server/Network/PollGroup/KQueuePollGroup.cs +++ b/Projects/Server/Network/PollGroup/KQueuePollGroup.cs @@ -15,6 +15,7 @@ using System; using System.IO; +using System.Net.Sockets; using System.Runtime.InteropServices; namespace Server.Network @@ -181,14 +182,14 @@ namespace Server.Network Marshal.FreeHGlobal(_zeroTimeoutPtr); } - public void Add(NetState state) + public void Add(Socket socket, GCHandle handle) { var rc = BSD.kevent( _kqueueHndle, - state.Connection.Handle, + socket.Handle, kqueue_filter.READ | kqueue_filter.WRITE, kqueue_flags.ADD | kqueue_flags.CLEAR, - udata: (IntPtr)state._handle + udata: (IntPtr)handle ); if (rc != 0) @@ -197,14 +198,13 @@ namespace Server.Network } } - public void Remove(NetState state) + public void Remove(Socket socket) { var rc = BSD.kevent( _kqueueHndle, - state.Connection.Handle, + socket.Handle, kqueue_filter.READ | kqueue_filter.WRITE, - kqueue_flags.DELETE, - udata: (IntPtr)state._handle + kqueue_flags.DELETE ); if (rc != 0) @@ -215,11 +215,11 @@ namespace Server.Network private kevent[] _events = new kevent[2048]; - public int Poll(ref NetState[] states) + public int Poll(ref GCHandle[] handles) { - if (states.Length > _events.Length) + if (handles.Length > _events.Length) { - var newLength = Math.Max(states.Length, _events.Length + (_events.Length >> 2)); + var newLength = Math.Max(handles.Length, _events.Length + (_events.Length >> 2)); _events = new kevent[newLength]; } @@ -230,19 +230,12 @@ namespace Server.Network return rc; } - int count = 0; - for (int i = 0; i < rc; i++) { - if (((GCHandle)_events[i].udata).Target is not NetState state) - { - continue; - } - - states[count++] = state; + handles[i] = (GCHandle)_events[i].udata; } - return count; + return rc; } } } diff --git a/Projects/Server/Network/PollGroup/PollGroup.cs b/Projects/Server/Network/PollGroup/PollGroup.cs index 9089f871b..0fa4fa875 100644 --- a/Projects/Server/Network/PollGroup/PollGroup.cs +++ b/Projects/Server/Network/PollGroup/PollGroup.cs @@ -14,14 +14,16 @@ *************************************************************************/ using System; +using System.Net.Sockets; +using System.Runtime.InteropServices; namespace Server.Network { public interface IPollGroup : IDisposable { - void Add(NetState state); - void Remove(NetState state); - int Poll(ref NetState[] states); + void Add(Socket sock, GCHandle handle); + void Remove(Socket sock); + int Poll(ref GCHandle[] handles); } public static class PollGroup diff --git a/Projects/Server/Network/TcpServer.cs b/Projects/Server/Network/TcpServer.cs index 428c40cf9..a9b9f1955 100644 --- a/Projects/Server/Network/TcpServer.cs +++ b/Projects/Server/Network/TcpServer.cs @@ -196,7 +196,7 @@ namespace Server.Network } else { - var ns = new NetState(new NetworkSocket(socket)); + var ns = new NetState(socket); _connectedQueue.Enqueue(ns); } } diff --git a/Projects/Server/wepoll.dll b/Projects/Server/wepoll.dll index d3f207d746070b8b0b540ca110c5a6822f10accb..f9383691d3ce8f8c96fb244c0d4908fe4bbbd484 100644 GIT binary patch delta 6532 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 i+B4eUXzy+BZ@1f%}j`^j1!hZo5*3@?Z delta 6454 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 diff --git a/Projects/UOContent/Misc/ServerList.cs b/Projects/UOContent/Misc/ServerList.cs index 33e33d2af..031f44bc8 100644 --- a/Projects/UOContent/Misc/ServerList.cs +++ b/Projects/UOContent/Misc/ServerList.cs @@ -68,7 +68,11 @@ namespace Server.Misc { var ns = e.State; - var ipep = (IPEndPoint)ns.Connection.LocalEndPoint; + var ipep = (IPEndPoint)ns.Connection?.LocalEndPoint; + if (ipep == null) + { + return; + } var localAddress = ipep.Address; var localPort = ipep.Port; @@ -76,7 +80,7 @@ namespace Server.Misc if (IsPrivateNetwork(localAddress)) { ipep = (IPEndPoint)ns.Connection.RemoteEndPoint; - if (!IsPrivateNetwork(ipep.Address) && _publicAddress != null) + if (ipep == null || !IsPrivateNetwork(ipep.Address) && _publicAddress != null) { localAddress = _publicAddress; } From 507eba34a8894729d0b23d3d52a0b9b22c84666f Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sat, 9 Oct 2021 13:52:53 -0700 Subject: [PATCH 4/9] fix: Replaces PollGroup with nuget (#823) --- .../Server/Network/PollGroup/EPollGroup.cs | 197 -------------- .../Network/PollGroup/KQueuePollGroup.cs | 241 ------------------ .../Server/Network/PollGroup/PollGroup.cs | 41 --- Projects/Server/Server.csproj | 29 +-- Projects/Server/wepoll.dll | Bin 21504 -> 0 bytes 5 files changed, 13 insertions(+), 495 deletions(-) delete mode 100755 Projects/Server/Network/PollGroup/EPollGroup.cs delete mode 100644 Projects/Server/Network/PollGroup/KQueuePollGroup.cs delete mode 100644 Projects/Server/Network/PollGroup/PollGroup.cs delete mode 100644 Projects/Server/wepoll.dll 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 f9383691d3ce8f8c96fb244c0d4908fe4bbbd484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21504 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 From fe0abc4a8fc596cf1c8e7e264ec02bf7cb0a5898 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sat, 9 Oct 2021 14:36:46 -0700 Subject: [PATCH 5/9] fix: Cleans up archiving and fixes wrong relative path used (#825) --- Projects/UOContent/Compression/ZstdArchive.cs | 10 ++++++---- Projects/UOContent/World Saves/AutoArchive.cs | 7 ++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Projects/UOContent/Compression/ZstdArchive.cs b/Projects/UOContent/Compression/ZstdArchive.cs index b121e023a..53769f09d 100755 --- a/Projects/UOContent/Compression/ZstdArchive.cs +++ b/Projects/UOContent/Compression/ZstdArchive.cs @@ -14,7 +14,8 @@ namespace Server.Compression // bsdtar has a bug and hangs, so we are doing it in two steps. if (Core.IsWindows) { - var tempTarArchive = Path.Combine(Core.BaseDirectory, "temp/temp-file.tar"); + var tempDir = PathUtility.EnsureRandomPath(Path.GetTempPath()); + var tempTarArchive = Path.Combine(tempDir, "temp-file.tar"); try { @@ -54,11 +55,12 @@ namespace Server.Compression // bsdtar has a bug and hangs, so we are doing it in two steps. if (Core.IsWindows) { - var tempTarArchive = Path.Combine(Core.BaseDirectory, "temp/temp-file.tar"); + var tempDir = PathUtility.EnsureRandomPath(Path.GetTempPath()); + var tempTarArchive = Path.Combine(tempDir, "temp-file.tar"); try { - if (!TarArchive.CreateFromPaths(paths, relativeTo, tempTarArchive)) + if (!TarArchive.CreateFromPaths(paths, tempTarArchive, relativeTo)) { return false; } @@ -83,7 +85,7 @@ namespace Server.Compression } finally { - File.Delete(tempTarArchive); + Directory.Delete(tempDir, true); } } diff --git a/Projects/UOContent/World Saves/AutoArchive.cs b/Projects/UOContent/World Saves/AutoArchive.cs index ed4dd4afd..7d46d6168 100755 --- a/Projects/UOContent/World Saves/AutoArchive.cs +++ b/Projects/UOContent/World Saves/AutoArchive.cs @@ -314,7 +314,7 @@ namespace Server.Saves foreach (var (rangeStart, sortedBackups) in items) { var backups = sortedBackups.Values; - if (backups.Count == 0) + if (backups.Count <= minimum) { continue; } @@ -397,7 +397,9 @@ namespace Server.Saves if (TryGetDate(name, out var date)) { - items.Add(date, item); + // Might give wrong results if there is a file that matches: + // Example: 2021-09-01, and 2021-09-01-00 + items[date] = item; } } @@ -435,7 +437,6 @@ namespace Server.Saves } catch { - logger.Warning($"Path was not in the correct date format: {value}"); date = DateTime.MinValue; return false; } From aabfabbb768236e2ac82b5bc4a6943f309ab3f2a Mon Sep 17 00:00:00 2001 From: Arthrutus <75637913+Arthrutus@users.noreply.github.com> Date: Sun, 10 Oct 2021 00:54:46 -0500 Subject: [PATCH 6/9] fix: Remove blood moss from near minoc moongate (#826) --- Distribution/Data/Decoration/Britannia/_hythloth.cfg | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Distribution/Data/Decoration/Britannia/_hythloth.cfg b/Distribution/Data/Decoration/Britannia/_hythloth.cfg index f85e11cf2..b462966b2 100644 --- a/Distribution/Data/Decoration/Britannia/_hythloth.cfg +++ b/Distribution/Data/Decoration/Britannia/_hythloth.cfg @@ -701,10 +701,6 @@ MetalDoor2 0x06C7 (Facing=EastCCW) 5988 159 0 6060 167 0 -# Blood Moss -Static 0x0F7B -2678 712 0 - # garbage Static 0x10F0 5988 46 22 From 9f0144dd085182545111e8810ae135f968e9f4c2 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sun, 10 Oct 2021 12:22:25 -0700 Subject: [PATCH 7/9] chore: Bumps PollGroup to 1.1.0 (#827) --- Projects/Server/Network/NetState/NetState.cs | 1 + Projects/Server/Server.csproj | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Projects/Server/Network/NetState/NetState.cs b/Projects/Server/Network/NetState/NetState.cs index a1104a6f8..943ff4f10 100755 --- a/Projects/Server/Network/NetState/NetState.cs +++ b/Projects/Server/Network/NetState/NetState.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Sockets; +using System.Network; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Server.Accounting; diff --git a/Projects/Server/Server.csproj b/Projects/Server/Server.csproj index 031478398..bf42d652f 100755 --- a/Projects/Server/Server.csproj +++ b/Projects/Server/Server.csproj @@ -35,7 +35,7 @@ - + From f4302928bb8a92c2b86d58e8bc21dc7dcb611b29 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Mon, 11 Oct 2021 23:53:17 -0700 Subject: [PATCH 8/9] fix: Fixes combat timers (#824) --- Projects/Server/Mobiles/Mobile.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Projects/Server/Mobiles/Mobile.cs b/Projects/Server/Mobiles/Mobile.cs index 02c2a43f2..5e259a849 100644 --- a/Projects/Server/Mobiles/Mobile.cs +++ b/Projects/Server/Mobiles/Mobile.cs @@ -916,8 +916,15 @@ namespace Server else { m_NetState.SendChangeCombatant(m_Combatant.Serial); - Timer.StartTimer(ExpireCombatantDelay, ExpireCombatant, out _expireCombatantTimerToken); - Timer.StartTimer(TimeSpan.FromSeconds(0.01), 0, CheckCombatTime, out _combatTimerToken); + if (!_expireCombatantTimerToken.Running) + { + Timer.StartTimer(ExpireCombatantDelay, ExpireCombatant, out _expireCombatantTimerToken); + } + + if (!_combatTimerToken.Running) + { + Timer.StartTimer(TimeSpan.FromSeconds(0.01), 0, CheckCombatTime, out _combatTimerToken); + } if (CanBeHarmful(m_Combatant, false)) { From 7361c9158b837235aece0d2521c75b4d14e604f4 Mon Sep 17 00:00:00 2001 From: nullptr-w8 <79784082+nullptr-w8@users.noreply.github.com> Date: Tue, 12 Oct 2021 12:04:40 +0500 Subject: [PATCH 9/9] fix: Fixes extracting zstd and deserializing old account version (#828) --- Projects/UOContent/Accounting/Account.Migrations.cs | 3 ++- Projects/UOContent/Compression/ZstdArchive.cs | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Projects/UOContent/Accounting/Account.Migrations.cs b/Projects/UOContent/Accounting/Account.Migrations.cs index 16b61efa1..dd9148b01 100644 --- a/Projects/UOContent/Accounting/Account.Migrations.cs +++ b/Projects/UOContent/Accounting/Account.Migrations.cs @@ -93,7 +93,8 @@ namespace Server.Accounting _totalGameTime = reader.ReadTimeSpan(); - _email = reader.ReadString(); + if (version > 1) + _email = reader.ReadString(); Timer.StartTimer(AfterDeserialization); } diff --git a/Projects/UOContent/Compression/ZstdArchive.cs b/Projects/UOContent/Compression/ZstdArchive.cs index 53769f09d..35fd533d5 100755 --- a/Projects/UOContent/Compression/ZstdArchive.cs +++ b/Projects/UOContent/Compression/ZstdArchive.cs @@ -23,8 +23,8 @@ namespace Server.Compression { StartInfo = new ProcessStartInfo { - FileName = _pathToZstd, - Arguments = $"-q -d \"{fileNamePath}\" -o \"${tempTarArchive}\"" + FileName = Path.Combine(_pathToZstd, "zstd.exe"), + Arguments = $"-q -d \"{fileNamePath}\" -o \"{tempTarArchive}\"" } };