|
|
|
@ -310,7 +310,7 @@ namespace Grpc.Core |
|
|
|
|
/// <summary> |
|
|
|
|
/// Selects corresponding handler for given call and handles the call. |
|
|
|
|
/// </summary> |
|
|
|
|
private async Task HandleCallAsync(ServerRpcNew newRpc, CompletionQueueSafeHandle cq) |
|
|
|
|
private async Task HandleCallAsync(ServerRpcNew newRpc, CompletionQueueSafeHandle cq, Action continuation) |
|
|
|
|
{ |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
@ -325,6 +325,11 @@ namespace Grpc.Core |
|
|
|
|
{ |
|
|
|
|
Logger.Warning(e, "Exception while handling RPC."); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (continuation != null) |
|
|
|
|
{ |
|
|
|
|
continuation(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
@ -332,8 +337,7 @@ namespace Grpc.Core |
|
|
|
|
/// </summary> |
|
|
|
|
private void HandleNewServerRpc(bool success, BatchContextSafeHandle ctx, CompletionQueueSafeHandle cq) |
|
|
|
|
{ |
|
|
|
|
Task.Run(() => AllowOneRpc(cq)); |
|
|
|
|
|
|
|
|
|
bool nextRpcRequested = false; |
|
|
|
|
if (success) |
|
|
|
|
{ |
|
|
|
|
ServerRpcNew newRpc = ctx.GetServerRpcNew(this); |
|
|
|
@ -341,9 +345,21 @@ namespace Grpc.Core |
|
|
|
|
// after server shutdown, the callback returns with null call |
|
|
|
|
if (!newRpc.Call.IsInvalid) |
|
|
|
|
{ |
|
|
|
|
HandleCallAsync(newRpc, cq); // we don't need to await. |
|
|
|
|
nextRpcRequested = true; |
|
|
|
|
|
|
|
|
|
// Start asynchronous handler for the call. |
|
|
|
|
// Don't await, the continuations will run on gRPC thread pool once triggered |
|
|
|
|
// by cq.Next(). |
|
|
|
|
#pragma warning disable 4014 |
|
|
|
|
HandleCallAsync(newRpc, cq, () => AllowOneRpc(cq)); |
|
|
|
|
#pragma warning restore 4014 |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!nextRpcRequested) |
|
|
|
|
{ |
|
|
|
|
AllowOneRpc(cq); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|