diff --git a/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs b/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs index b2ecc29db6..613b53d264 100644 --- a/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs +++ b/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs @@ -145,6 +145,11 @@ namespace Tgstation.Server.Host.Components.Watchdog /// bool apiValidated; + /// + /// If should be kept alive instead + /// + bool released; + /// /// Construct a /// @@ -171,22 +176,50 @@ namespace Tgstation.Server.Host.Components.Watchdog portClosed = false; disposed = false; apiValidated = false; + released = false; rebootTcs = new TaskCompletionSource(); } + /// + /// Finalize the + /// + ~SessionController() => Dispose(false); + /// public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + void Dispose(bool disposing) { lock (this) { if (disposed) return; - session.Dispose(); - interopContext.Dispose(); - Dmb?.Dispose(); //will be null when released - chatJsonTrackingContext.Dispose(); - disposed = true; + if (disposing) + { + if (!released) + session.Terminate(); + session.Dispose(); + interopContext.Dispose(); + Dmb?.Dispose(); //will be null when released + chatJsonTrackingContext.Dispose(); + disposed = true; + } + else + { + if (logger != null) + logger.LogError("Being disposed via finalizer!"); + if (!released) + if (session != null) + session.Terminate(); + else if (logger != null) + logger.LogCritical("Unable to terminate active DreamDaemon session due to finalizer ordering!"); + } } } @@ -256,6 +289,7 @@ namespace Tgstation.Server.Host.Components.Watchdog //we still don't want to dispose the dmb yet, even though we're keeping it alive var tmpProvider = reattachInformation.Dmb; reattachInformation.Dmb = null; + released = true; Dispose(); Dmb.KeepAlive(); reattachInformation.Dmb = tmpProvider;