deduplicate server shutdown logic

pull/6754/head
Jan Tattermusch 9 years ago
parent 4aea5281de
commit 63386a1064
  1. 57
      src/csharp/Grpc.Core/Server.cs

@ -155,21 +155,9 @@ namespace Grpc.Core
/// <remarks> /// <remarks>
/// It is strongly recommended to shutdown all previously created servers before exiting from the process. /// It is strongly recommended to shutdown all previously created servers before exiting from the process.
/// </remarks> /// </remarks>
public async Task ShutdownAsync() public Task ShutdownAsync()
{ {
lock (myLock) return ShutdownInternalAsync(false);
{
GrpcPreconditions.CheckState(startRequested);
GrpcPreconditions.CheckState(!shutdownRequested);
shutdownRequested = true;
}
var cq = environment.CompletionQueues.First(); // any cq will do
handle.ShutdownAndNotify(HandleServerShutdown, cq);
await shutdownTcs.Task.ConfigureAwait(false);
DisposeHandle();
await GrpcEnvironment.ReleaseAsync().ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -179,22 +167,9 @@ namespace Grpc.Core
/// <remarks> /// <remarks>
/// It is strongly recommended to shutdown all previously created servers before exiting from the process. /// It is strongly recommended to shutdown all previously created servers before exiting from the process.
/// </remarks> /// </remarks>
public async Task KillAsync() public Task KillAsync()
{ {
lock (myLock) return ShutdownInternalAsync(true);
{
GrpcPreconditions.CheckState(startRequested);
GrpcPreconditions.CheckState(!shutdownRequested);
shutdownRequested = true;
}
var cq = environment.CompletionQueues.First(); // any cq will do
handle.ShutdownAndNotify(HandleServerShutdown, cq);
handle.CancelAllCalls();
await shutdownTcs.Task.ConfigureAwait(false);
DisposeHandle();
await GrpcEnvironment.ReleaseAsync().ConfigureAwait(false);
} }
internal void AddCallReference(object call) internal void AddCallReference(object call)
@ -212,6 +187,30 @@ namespace Grpc.Core
activeCallCounter.Decrement(); activeCallCounter.Decrement();
} }
/// <summary>
/// Shuts down the server.
/// </summary>
private async Task ShutdownInternalAsync(bool kill)
{
lock (myLock)
{
GrpcPreconditions.CheckState(startRequested);
GrpcPreconditions.CheckState(!shutdownRequested);
shutdownRequested = true;
}
var cq = environment.CompletionQueues.First(); // any cq will do
handle.ShutdownAndNotify(HandleServerShutdown, cq);
if (kill)
{
handle.CancelAllCalls();
}
await shutdownTcs.Task.ConfigureAwait(false);
DisposeHandle();
await GrpcEnvironment.ReleaseAsync().ConfigureAwait(false);
}
/// <summary> /// <summary>
/// Adds a service definition. /// Adds a service definition.
/// </summary> /// </summary>

Loading…
Cancel
Save