diff --git a/CelesteNet.Server/CelesteNetServer.cs b/CelesteNet.Server/CelesteNetServer.cs index 074515ce..85f245ae 100644 --- a/CelesteNet.Server/CelesteNetServer.cs +++ b/CelesteNet.Server/CelesteNetServer.cs @@ -70,6 +70,7 @@ public bool IsAlive { ShutdownTokenSrc.Cancel(); } } + private bool _disposed = false; public CelesteNetServer() : this(new()) { @@ -200,18 +201,23 @@ public void Start() { } public void Wait() { - foreach (CelesteNetConnection con in SafeDisposeQueue.GetConsumingEnumerable(ShutdownTokenSrc.Token)) { - if (con.IsAlive) { - Logger.Log("main", $"Safe dispose triggered for connection {con}"); - con.Dispose(); + try { + foreach (CelesteNetConnection con in SafeDisposeQueue.GetConsumingEnumerable(ShutdownTokenSrc.Token)) { + if (con.IsAlive) { + Logger.Log("main", $"Safe dispose triggered for connection {con}"); + con.Dispose(); + } } + } catch (OperationCanceledException) { + Logger.Log(LogLevel.CRI, "main", "ShutdownTokenSrc canceled, shutting down."); } + ShutdownTokenSrc.Dispose(); SafeDisposeQueue.Dispose(); } public void Dispose() { - if (!IsAlive) + if (_disposed) return; Logger.Log(LogLevel.CRI, "main", "Shutdown"); @@ -234,6 +240,7 @@ public void Dispose() { UserData.Dispose(); Data.Dispose(); + _disposed = true; } diff --git a/CelesteNet.Server/ConPlus/TCPEPollPoller.cs b/CelesteNet.Server/ConPlus/TCPEPollPoller.cs index 6898a2e7..14c3d8e2 100644 --- a/CelesteNet.Server/ConPlus/TCPEPollPoller.cs +++ b/CelesteNet.Server/ConPlus/TCPEPollPoller.cs @@ -91,8 +91,8 @@ public void Dispose() { Connections.Clear(); ConIds.Clear(); - PollerLock.Dispose(); } + PollerLock.Dispose(); } public void AddConnection(ConPlusTCPUDPConnection con) { diff --git a/CelesteNet.Server/ConPlus/TCPFallbackPoller.cs b/CelesteNet.Server/ConPlus/TCPFallbackPoller.cs index 5e592100..fbf510a9 100644 --- a/CelesteNet.Server/ConPlus/TCPFallbackPoller.cs +++ b/CelesteNet.Server/ConPlus/TCPFallbackPoller.cs @@ -22,8 +22,8 @@ public void Dispose() { using (PollerLock.W()) { Cons.Clear(); ConQueue.Dispose(); - PollerLock.Dispose(); } + PollerLock.Dispose(); } public void AddConnection(ConPlusTCPUDPConnection con) { diff --git a/CelesteNet.Server/NetPlus/ThreadPool.cs b/CelesteNet.Server/NetPlus/ThreadPool.cs index 0941378a..014827ad 100644 --- a/CelesteNet.Server/NetPlus/ThreadPool.cs +++ b/CelesteNet.Server/NetPlus/ThreadPool.cs @@ -63,14 +63,14 @@ public void Dispose() { using (_PoolLock.W()) using (_RoleLock.W()) { // Stop threads - TokenSrc.Dispose(); + TokenSrc.Cancel(); foreach (NetPlusThread thread in Threads) thread.Thread.Join(); - + TokenSrc.Dispose(); RuntimeWatch.Stop(); - _RoleLock.Dispose(); - _PoolLock.Dispose(); } + _RoleLock.Dispose(); + _PoolLock.Dispose(); } public float IterateSteadyHeuristic(ref float lastVal, ref long lastUpdate, float curVal, bool update = false) { diff --git a/CelesteNet.Server/NetPlus/ThreadRole.cs b/CelesteNet.Server/NetPlus/ThreadRole.cs index b0e6671f..290ca559 100644 --- a/CelesteNet.Server/NetPlus/ThreadRole.cs +++ b/CelesteNet.Server/NetPlus/ThreadRole.cs @@ -32,8 +32,9 @@ protected RoleWorker(NetPlusThreadRole role, NetPlusThread thread) { } public virtual void Dispose() { - using (Role.WorkerLock.W()) - Role.Workers.Remove(this); + if (Role.Workers.Contains(this)) + using (Role.WorkerLock.W()) + Role.Workers.Remove(this); ActivityLock.Dispose(); } @@ -84,8 +85,8 @@ public virtual void Dispose() { using (WorkerLock.W()) { Workers.Clear(); - WorkerLock.Dispose(); } + WorkerLock.Dispose(); } public virtual void InvokeSchedular() {} diff --git a/CelesteNet.Server/Program.cs b/CelesteNet.Server/Program.cs index 7a953e28..107ba5d5 100644 --- a/CelesteNet.Server/Program.cs +++ b/CelesteNet.Server/Program.cs @@ -138,6 +138,7 @@ private static void MainRun(CelesteNetServerSettings settings) { using CelesteNetServer server = Server = new(settings); server.Start(); server.Wait(); + server.Dispose(); Server = null; } diff --git a/CelesteNet.Shared/RWLock.cs b/CelesteNet.Shared/RWLock.cs index 66dbf64a..111b3089 100644 --- a/CelesteNet.Shared/RWLock.cs +++ b/CelesteNet.Shared/RWLock.cs @@ -16,7 +16,7 @@ namespace Celeste.Mod.CelesteNet { public class RWLock : IDisposable { - public readonly ReaderWriterLockSlim Inner = new(LockRecursionPolicy.SupportsRecursion); + private readonly ReaderWriterLockSlim Inner = new(LockRecursionPolicy.SupportsRecursion); private readonly RLock _R; private readonly RULock _RU; private readonly WLock _W; @@ -36,7 +36,7 @@ public void Dispose() { } public class RLock : IDisposable { - public readonly ReaderWriterLockSlim Inner; + private readonly ReaderWriterLockSlim Inner; public RLock(ReaderWriterLockSlim inner) { Inner = inner; @@ -53,7 +53,7 @@ public void Dispose() { } public class RULock : IDisposable { - public readonly ReaderWriterLockSlim Inner; + private readonly ReaderWriterLockSlim Inner; public RULock(ReaderWriterLockSlim inner) { Inner = inner; @@ -70,7 +70,7 @@ public void Dispose() { } public class WLock : IDisposable { - public readonly ReaderWriterLockSlim Inner; + private readonly ReaderWriterLockSlim Inner; public WLock(ReaderWriterLockSlim inner) { Inner = inner;