Merge pull request #11 from jtattermusch/you-complete-me

adapt C# to the new server shutdown API
pull/1731/head
Craig Tiller 10 years ago
commit c590f213c7
  1. 19
      src/csharp/Grpc.Core/Internal/ServerSafeHandle.cs
  2. 18
      src/csharp/Grpc.Core/Server.cs
  3. 11
      src/csharp/ext/grpc_csharp_ext.c

@ -60,10 +60,10 @@ namespace Grpc.Core.Internal
static extern void grpcsharp_server_start(ServerSafeHandle server); static extern void grpcsharp_server_start(ServerSafeHandle server);
[DllImport("grpc_csharp_ext.dll")] [DllImport("grpc_csharp_ext.dll")]
static extern void grpcsharp_server_shutdown(ServerSafeHandle server); static extern void grpcsharp_server_shutdown_and_notify_callback(ServerSafeHandle server, CompletionQueueSafeHandle cq, [MarshalAs(UnmanagedType.FunctionPtr)] CompletionCallbackDelegate callback);
[DllImport("grpc_csharp_ext.dll")] [DllImport("grpc_csharp_ext.dll")]
static extern void grpcsharp_server_shutdown_and_notify_callback(ServerSafeHandle server, [MarshalAs(UnmanagedType.FunctionPtr)] CompletionCallbackDelegate callback); static extern void grpcsharp_server_cancel_all_calls(ServerSafeHandle server);
[DllImport("grpc_csharp_ext.dll")] [DllImport("grpc_csharp_ext.dll")]
static extern void grpcsharp_server_destroy(IntPtr server); static extern void grpcsharp_server_destroy(IntPtr server);
@ -92,14 +92,9 @@ namespace Grpc.Core.Internal
grpcsharp_server_start(this); grpcsharp_server_start(this);
} }
public void Shutdown() public void ShutdownAndNotify(CompletionQueueSafeHandle cq, CompletionCallbackDelegate callback)
{ {
grpcsharp_server_shutdown(this); grpcsharp_server_shutdown_and_notify_callback(this, cq, callback);
}
public void ShutdownAndNotify(CompletionCallbackDelegate callback)
{
grpcsharp_server_shutdown_and_notify_callback(this, callback);
} }
public void RequestCall(CompletionQueueSafeHandle cq, CompletionCallbackDelegate callback) public void RequestCall(CompletionQueueSafeHandle cq, CompletionCallbackDelegate callback)
@ -113,6 +108,12 @@ namespace Grpc.Core.Internal
return true; return true;
} }
// Only to be called after ShutdownAndNotify.
public void CancelAllCalls()
{
grpcsharp_server_cancel_all_calls(this);
}
private static void AssertCallOk(GRPCCallError callError) private static void AssertCallOk(GRPCCallError callError)
{ {
Preconditions.CheckState(callError == GRPCCallError.GRPC_CALL_OK, "Status not GRPC_CALL_OK"); Preconditions.CheckState(callError == GRPCCallError.GRPC_CALL_OK, "Status not GRPC_CALL_OK");

@ -144,7 +144,7 @@ namespace Grpc.Core
shutdownRequested = true; shutdownRequested = true;
} }
handle.ShutdownAndNotify(serverShutdownHandler); handle.ShutdownAndNotify(GetCompletionQueue(), serverShutdownHandler);
await shutdownTcs.Task; await shutdownTcs.Task;
handle.Dispose(); handle.Dispose();
} }
@ -160,8 +160,22 @@ namespace Grpc.Core
} }
} }
public void Kill() /// <summary>
/// Requests server shutdown while cancelling all the in-progress calls.
/// The returned task finishes when shutdown procedure is complete.
/// </summary>
public async Task KillAsync()
{ {
lock (myLock)
{
Preconditions.CheckState(startRequested);
Preconditions.CheckState(!shutdownRequested);
shutdownRequested = true;
}
handle.ShutdownAndNotify(GetCompletionQueue(), serverShutdownHandler);
handle.CancelAllCalls();
await shutdownTcs.Task;
handle.Dispose(); handle.Dispose();
} }

@ -677,16 +677,17 @@ GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_start(grpc_server *server) {
grpc_server_start(server); grpc_server_start(server);
} }
GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_shutdown(grpc_server *server) {
grpc_server_shutdown(server);
}
GPR_EXPORT void GPR_CALLTYPE GPR_EXPORT void GPR_CALLTYPE
grpcsharp_server_shutdown_and_notify_callback(grpc_server *server, grpcsharp_server_shutdown_and_notify_callback(grpc_server *server,
grpc_completion_queue *cq,
callback_funcptr callback) { callback_funcptr callback) {
grpcsharp_batch_context *ctx = grpcsharp_batch_context_create(); grpcsharp_batch_context *ctx = grpcsharp_batch_context_create();
ctx->callback = callback; ctx->callback = callback;
grpc_server_shutdown_and_notify(server, ctx); grpc_server_shutdown_and_notify(server, cq, ctx);
}
GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_cancel_all_calls(grpc_server *server) {
grpc_server_cancel_all_calls(server);
} }
GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_destroy(grpc_server *server) { GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_destroy(grpc_server *server) {

Loading…
Cancel
Save