From eefbb581ef59fb114da3ec818179e40c6925714a Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 25 May 2020 22:27:28 -0400 Subject: [PATCH] DisposeAndNullControllers from a locked context --- .../Components/Watchdog/BasicWatchdog.cs | 2 +- .../Components/Watchdog/ExperimentalWatchdog.cs | 6 ++---- .../Components/Watchdog/WatchdogBase.cs | 17 ++++++++++++++++- .../Components/Watchdog/WindowsWatchdog.cs | 4 ++-- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/Tgstation.Server.Host/Components/Watchdog/BasicWatchdog.cs b/src/Tgstation.Server.Host/Components/Watchdog/BasicWatchdog.cs index 13c96f350a..e3e8968fd8 100644 --- a/src/Tgstation.Server.Host/Components/Watchdog/BasicWatchdog.cs +++ b/src/Tgstation.Server.Host/Components/Watchdog/BasicWatchdog.cs @@ -192,7 +192,7 @@ namespace Tgstation.Server.Host.Components.Watchdog }; /// - protected override void DisposeAndNullControllers() + protected override void DisposeAndNullControllersImpl() { Server?.Dispose(); Server = null; diff --git a/src/Tgstation.Server.Host/Components/Watchdog/ExperimentalWatchdog.cs b/src/Tgstation.Server.Host/Components/Watchdog/ExperimentalWatchdog.cs index 02daf7d157..6547ef6d62 100644 --- a/src/Tgstation.Server.Host/Components/Watchdog/ExperimentalWatchdog.cs +++ b/src/Tgstation.Server.Host/Components/Watchdog/ExperimentalWatchdog.cs @@ -392,10 +392,8 @@ namespace Tgstation.Server.Host.Components.Watchdog } #pragma warning restore CA1502 - /// - /// Call on and and set them to - /// - protected override void DisposeAndNullControllers() + /// + protected override void DisposeAndNullControllersImpl() { alphaServer?.Dispose(); alphaServer = null; diff --git a/src/Tgstation.Server.Host/Components/Watchdog/WatchdogBase.cs b/src/Tgstation.Server.Host/Components/Watchdog/WatchdogBase.cs index 74b3e06371..66837c302a 100644 --- a/src/Tgstation.Server.Host/Components/Watchdog/WatchdogBase.cs +++ b/src/Tgstation.Server.Host/Components/Watchdog/WatchdogBase.cs @@ -112,6 +112,11 @@ namespace Tgstation.Server.Host.Components.Watchdog /// readonly IRestartRegistration restartRegistration; + /// + /// used for . + /// + readonly object controllerDisposeLock; + /// /// If the should in /// @@ -201,6 +206,7 @@ namespace Tgstation.Server.Host.Components.Watchdog ActiveLaunchParameters = initialLaunchParameters; releaseServers = false; ActiveParametersUpdated = new TaskCompletionSource(); + controllerDisposeLock = new object(); restartRegistration = serverControl.RegisterForRestart(this); try @@ -463,7 +469,16 @@ namespace Tgstation.Server.Host.Components.Watchdog /// /// Call and null the fields for all s and set to . /// - protected abstract void DisposeAndNullControllers(); + protected abstract void DisposeAndNullControllersImpl(); + + /// + /// Wrapper for under a locked context. + /// + protected void DisposeAndNullControllers() + { + lock (controllerDisposeLock) + DisposeAndNullControllersImpl(); + } /// /// Get the active . diff --git a/src/Tgstation.Server.Host/Components/Watchdog/WindowsWatchdog.cs b/src/Tgstation.Server.Host/Components/Watchdog/WindowsWatchdog.cs index 895347f4a6..730ced06b9 100644 --- a/src/Tgstation.Server.Host/Components/Watchdog/WindowsWatchdog.cs +++ b/src/Tgstation.Server.Host/Components/Watchdog/WindowsWatchdog.cs @@ -101,9 +101,9 @@ namespace Tgstation.Server.Host.Components.Watchdog } /// - protected override void DisposeAndNullControllers() + protected override void DisposeAndNullControllersImpl() { - base.DisposeAndNullControllers(); + base.DisposeAndNullControllersImpl(); // If we reach this point, we can guarantee PrepServerForLaunch will be called before starting again. activeSwappable = null;