diff --git a/Vostok.Hosting/PublicAPI/net6.0/PublicAPI.Shipped.txt b/Vostok.Hosting/PublicAPI/net6.0/PublicAPI.Shipped.txt index 7e061a31..934ed2c8 100644 --- a/Vostok.Hosting/PublicAPI/net6.0/PublicAPI.Shipped.txt +++ b/Vostok.Hosting/PublicAPI/net6.0/PublicAPI.Shipped.txt @@ -596,6 +596,7 @@ Vostok.Hosting.VostokHost Vostok.Hosting.VostokHost.StartAsync(Vostok.Hosting.Models.VostokApplicationState? stateToAwait = 5) -> System.Threading.Tasks.Task Vostok.Hosting.VostokHost.StopAsync(bool ensureSuccess = true) -> System.Threading.Tasks.Task Vostok.Hosting.VostokHost.VostokHost(Vostok.Hosting.VostokHostSettings settings) -> void +Vostok.Hosting.VostokHost.RegisterSigtermCancellation() -> Vostok.Hosting.VostokHost Vostok.Hosting.VostokHost_Extensions Vostok.Hosting.VostokHostingEnvironmentFactory Vostok.Hosting.VostokHostingEnvironmentFactorySettings diff --git a/Vostok.Hosting/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt b/Vostok.Hosting/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt index c3ad1bbf..128ce3ec 100644 --- a/Vostok.Hosting/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt +++ b/Vostok.Hosting/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt @@ -593,6 +593,7 @@ Vostok.Hosting.VostokHost Vostok.Hosting.VostokHost.StartAsync(Vostok.Hosting.Models.VostokApplicationState? stateToAwait = 5) -> System.Threading.Tasks.Task Vostok.Hosting.VostokHost.StopAsync(bool ensureSuccess = true) -> System.Threading.Tasks.Task Vostok.Hosting.VostokHost.VostokHost(Vostok.Hosting.VostokHostSettings settings) -> void +Vostok.Hosting.VostokHost.RegisterSigtermCancellation() -> Vostok.Hosting.VostokHost Vostok.Hosting.VostokHost_Extensions Vostok.Hosting.VostokHostingEnvironmentFactory Vostok.Hosting.VostokHostingEnvironmentFactorySettings @@ -665,4 +666,4 @@ Vostok.Hosting.VostokHostShutdown Vostok.Hosting.VostokHostShutdown.Initiate() -> void Vostok.Hosting.VostokHostShutdown.IsInitiated.get -> bool Vostok.Hosting.VostokHostShutdown.Source.get -> System.Threading.CancellationTokenSource -Vostok.Hosting.VostokHostShutdown.VostokHostShutdown(System.Threading.CancellationTokenSource source) -> void +Vostok.Hosting.VostokHostShutdown.VostokHostShutdown(System.Threading.CancellationTokenSource source) -> void \ No newline at end of file diff --git a/Vostok.Hosting/Vostok.Hosting.csproj b/Vostok.Hosting/Vostok.Hosting.csproj index 930bebdf..46281fe5 100644 --- a/Vostok.Hosting/Vostok.Hosting.csproj +++ b/Vostok.Hosting/Vostok.Hosting.csproj @@ -6,7 +6,7 @@ Debug;Release - 0.3.69 + 0.3.70 Vostok.Hosting diff --git a/Vostok.Hosting/VostokHost.cs b/Vostok.Hosting/VostokHost.cs index fd1b9f21..e0ac7848 100644 --- a/Vostok.Hosting/VostokHost.cs +++ b/Vostok.Hosting/VostokHost.cs @@ -1,5 +1,8 @@ using System; using System.Diagnostics; +#if NET6_0_OR_GREATER +using System.Runtime.InteropServices; +#endif using System.Threading; using System.Threading.Tasks; using JetBrains.Annotations; @@ -51,6 +54,9 @@ public class VostokHost private volatile Task workerTask; private volatile VostokHostingEnvironment environment; private volatile ILog log; +#if NET6_0_OR_GREATER + private volatile PosixSignalRegistration sigtermRegistration; +#endif public VostokHost([NotNull] VostokHostSettings settings) { @@ -158,6 +164,34 @@ public Task StopAsync(bool ensureSuccess = true) return resultTask; } + +#if NET6_0_OR_GREATER + /// + /// Listen and shutdown VostokHost if received. + /// +#else + /// + /// Listen and shutdown VostokHost if SIGTERM received. + /// +#endif + public VostokHost RegisterSigtermCancellation() + { +#if NET6_0_OR_GREATER + // Saving PosixSignalRegistration reference to nameof(VostokHost) field, because of IDisposable inheritance, + // and GC will collect if not assigned. On Dispose and finalize handler will unregister. + if (sigtermRegistration == null) + { + sigtermRegistration = PosixSignalRegistration.Create(PosixSignal.SIGTERM, ctx => + { + ctx.Cancel = true; + this.Stop(false); + }); + } +#else + AppDomain.CurrentDomain.ProcessExit += (_, _) => this.Stop(false); +#endif + return this; + } private async Task RunInternalAsync() { @@ -170,6 +204,9 @@ private async Task RunInternalAsync() var dynamicThreadPool = ConfigureDynamicThreadPool(); +#if NET6_0_OR_GREATER + using (sigtermRegistration) +#endif using (environment) using (new ApplicationDisposable(settings.Application, environment, log)) using (dynamicThreadPool) diff --git a/Vostok.Hosting/VostokHost_Extensions.cs b/Vostok.Hosting/VostokHost_Extensions.cs index a4b3091b..d6626bf5 100644 --- a/Vostok.Hosting/VostokHost_Extensions.cs +++ b/Vostok.Hosting/VostokHost_Extensions.cs @@ -49,13 +49,9 @@ public static VostokHost WithConsoleCancellation([NotNull] this VostokHost vosto } /// - /// Listen and shutdown VostokHost if SIGTERM received. + /// Makes same as /// - public static VostokHost WithSigtermCancellation([NotNull] this VostokHost vostokHost) - { - AppDomain.CurrentDomain.ProcessExit += (_, _) => vostokHost.Stop(false); - - return vostokHost; - } + public static VostokHost WithSigtermCancellation([NotNull] this VostokHost vostokHost) => + vostokHost.RegisterSigtermCancellation(); } } \ No newline at end of file