mirror of
https://github.com/tgstation/tgstation-server.git
synced 2026-08-30 08:33:19 +01:00
DisposeAndNullControllers from a locked context
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user