Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions CelesteNet.Server/CelesteNetServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ public bool IsAlive {
ShutdownTokenSrc.Cancel();
}
}
private bool _disposed = false;

public CelesteNetServer()
: this(new()) {
Expand Down Expand Up @@ -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}");
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I made this PR the last time we had a catastrophic lock disposal situation, I guess. Some kinda really rare race... this may be good to merge and see what it does on the server 🤔
Anyways TODO this line needs changing because it shouldn't default to VVV log level (honestly nothing ever should? Why is that the implicit level?)

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");
Expand All @@ -234,6 +240,7 @@ public void Dispose() {
UserData.Dispose();

Data.Dispose();
_disposed = true;
}


Expand Down
2 changes: 1 addition & 1 deletion CelesteNet.Server/ConPlus/TCPEPollPoller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ public void Dispose() {

Connections.Clear();
ConIds.Clear();
PollerLock.Dispose();
}
PollerLock.Dispose();
}

public void AddConnection(ConPlusTCPUDPConnection con) {
Expand Down
2 changes: 1 addition & 1 deletion CelesteNet.Server/ConPlus/TCPFallbackPoller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ public void Dispose() {
using (PollerLock.W()) {
Cons.Clear();
ConQueue.Dispose();
PollerLock.Dispose();
}
PollerLock.Dispose();
}

public void AddConnection(ConPlusTCPUDPConnection con) {
Expand Down
8 changes: 4 additions & 4 deletions CelesteNet.Server/NetPlus/ThreadPool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
7 changes: 4 additions & 3 deletions CelesteNet.Server/NetPlus/ThreadRole.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down Expand Up @@ -84,8 +85,8 @@ public virtual void Dispose() {

using (WorkerLock.W()) {
Workers.Clear();
WorkerLock.Dispose();
}
WorkerLock.Dispose();
}

public virtual void InvokeSchedular() {}
Expand Down
1 change: 1 addition & 0 deletions CelesteNet.Server/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ private static void MainRun(CelesteNetServerSettings settings) {
using CelesteNetServer server = Server = new(settings);
server.Start();
server.Wait();
server.Dispose();
Server = null;
}

Expand Down
8 changes: 4 additions & 4 deletions CelesteNet.Shared/RWLock.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down