fix C# connectivity watcher shutdown race

pull/14776/head
Jan Tattermusch 7 years ago
parent e5821cdad2
commit 9b9807a48c
  1. 14
      src/csharp/Grpc.Core/Channel.cs

@ -160,8 +160,18 @@ namespace Grpc.Core
var deadlineTimespec = deadline.HasValue ? Timespec.FromDateTime(deadline.Value) : Timespec.InfFuture; var deadlineTimespec = deadline.HasValue ? Timespec.FromDateTime(deadline.Value) : Timespec.InfFuture;
lock (myLock) lock (myLock)
{ {
// pass "tcs" as "state" for WatchConnectivityStateHandler. if (handle.IsClosed)
handle.WatchConnectivityState(lastObservedState, deadlineTimespec, completionQueue, WatchConnectivityStateHandler, tcs); {
// If channel has been already shutdown and handle was disposed, we would end up with
// an abandoned completion added to the completion registry. So we act as if the
// wait has timed out instead.
tcs.SetResult(false);
}
else
{
// pass "tcs" as "state" for WatchConnectivityStateHandler.
handle.WatchConnectivityState(lastObservedState, deadlineTimespec, completionQueue, WatchConnectivityStateHandler, tcs);
}
} }
return tcs.Task; return tcs.Task;
} }

Loading…
Cancel
Save