DisposeAndNullControllers from a locked context

This commit is contained in:
Jordan Brown
2020-05-25 22:27:28 -04:00
parent 5ca472f369
commit eefbb581ef
4 changed files with 21 additions and 8 deletions
@@ -192,7 +192,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
};
/// <inheritdoc />
protected override void DisposeAndNullControllers()
protected override void DisposeAndNullControllersImpl()
{
Server?.Dispose();
Server = null;
@@ -392,10 +392,8 @@ namespace Tgstation.Server.Host.Components.Watchdog
}
#pragma warning restore CA1502
/// <summary>
/// Call <see cref="IDisposable.Dispose"/> on <see cref="alphaServer"/> and <see cref="bravoServer"/> and set them to <see langword="null"/>
/// </summary>
protected override void DisposeAndNullControllers()
/// <inheritdoc />
protected override void DisposeAndNullControllersImpl()
{
alphaServer?.Dispose();
alphaServer = null;
@@ -112,6 +112,11 @@ namespace Tgstation.Server.Host.Components.Watchdog
/// </summary>
readonly IRestartRegistration restartRegistration;
/// <summary>
/// <see langword="lock"/> <see cref="object"/> used for <see cref="DisposeAndNullControllers"/>.
/// </summary>
readonly object controllerDisposeLock;
/// <summary>
/// If the <see cref="WatchdogBase"/> should <see cref="LaunchImplNoLock(bool, bool, DualReattachInformation, CancellationToken)"/> in <see cref="StartAsync(CancellationToken)"/>
/// </summary>
@@ -201,6 +206,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
ActiveLaunchParameters = initialLaunchParameters;
releaseServers = false;
ActiveParametersUpdated = new TaskCompletionSource<object>();
controllerDisposeLock = new object();
restartRegistration = serverControl.RegisterForRestart(this);
try
@@ -463,7 +469,16 @@ namespace Tgstation.Server.Host.Components.Watchdog
/// <summary>
/// Call <see cref="IDisposable.Dispose"/> and null the fields for all <see cref="ISessionController"/>s and set <see cref="Running"/> to <see langword="false"/>.
/// </summary>
protected abstract void DisposeAndNullControllers();
protected abstract void DisposeAndNullControllersImpl();
/// <summary>
/// Wrapper for <see cref="DisposeAndNullControllersImpl"/> under a locked context.
/// </summary>
protected void DisposeAndNullControllers()
{
lock (controllerDisposeLock)
DisposeAndNullControllersImpl();
}
/// <summary>
/// Get the active <see cref="ISessionController"/>.
@@ -101,9 +101,9 @@ namespace Tgstation.Server.Host.Components.Watchdog
}
/// <inheritdoc />
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;