dont use shutdownRef count for sync completion queue

pull/19629/head
Jan Tattermusch 5 years ago
parent b0c9849393
commit 7142d9e2dc
  1. 19
      src/csharp/Grpc.Core/Internal/CompletionQueueSafeHandle.cs

@ -29,7 +29,7 @@ namespace Grpc.Core.Internal
{ {
static readonly NativeMethods Native = NativeMethods.Get(); static readonly NativeMethods Native = NativeMethods.Get();
AtomicCounter shutdownRefcount = new AtomicCounter(1); AtomicCounter shutdownRefcount;
CompletionRegistry completionRegistry; CompletionRegistry completionRegistry;
private CompletionQueueSafeHandle() private CompletionQueueSafeHandle()
@ -51,6 +51,7 @@ namespace Grpc.Core.Internal
{ {
var cq = Native.grpcsharp_completion_queue_create_async(); var cq = Native.grpcsharp_completion_queue_create_async();
cq.completionRegistry = completionRegistry; cq.completionRegistry = completionRegistry;
cq.shutdownRefcount = new AtomicCounter(1);
return cq; return cq;
} }
@ -95,7 +96,7 @@ namespace Grpc.Core.Internal
private void DecrementShutdownRefcount() private void DecrementShutdownRefcount()
{ {
if (shutdownRefcount.Decrement() == 0) if (shutdownRefcount == null || shutdownRefcount.Decrement() == 0)
{ {
Native.grpcsharp_completion_queue_shutdown(this); Native.grpcsharp_completion_queue_shutdown(this);
} }
@ -103,14 +104,20 @@ namespace Grpc.Core.Internal
private void BeginOp() private void BeginOp()
{ {
bool success = false; if (shutdownRefcount != null)
shutdownRefcount.IncrementIfNonzero(ref success); {
GrpcPreconditions.CheckState(success, "Shutdown has already been called"); bool success = false;
shutdownRefcount.IncrementIfNonzero(ref success);
GrpcPreconditions.CheckState(success, "Shutdown has already been called");
}
} }
private void EndOp() private void EndOp()
{ {
DecrementShutdownRefcount(); if (shutdownRefcount != null)
{
DecrementShutdownRefcount();
}
} }
// Allows declaring BeginOp and EndOp of a completion queue with a using statement. // Allows declaring BeginOp and EndOp of a completion queue with a using statement.

Loading…
Cancel
Save