From 3d17f8d4f842f857f4687a428735246215b2fde6 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 11 Feb 2020 01:47:47 -0800 Subject: [PATCH] Use a different fix for #21969 --- .../filters/client_channel/client_channel.cc | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index b35d359b915..8005692782e 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -878,24 +878,19 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { "chand=%p: destroying subchannel wrapper %p for subchannel %p", chand_, this, subchannel_); } - auto *subchannel_wrapper = this; - auto *subchannel = subchannel_; - auto *chand = chand_; - chand_->work_serializer()->Run([chand, subchannel, subchannel_wrapper]() { - chand->subchannel_wrappers_.erase(subchannel_wrapper); - auto* subchannel_node = subchannel->channelz_node(); - if (subchannel_node != nullptr) { - auto it = chand->subchannel_refcount_map_.find(subchannel); - GPR_ASSERT(it != chand->subchannel_refcount_map_.end()); - --it->second; - if (it->second == 0) { - chand->channelz_node_->RemoveChildSubchannel(subchannel_node->uuid()); - chand->subchannel_refcount_map_.erase(it); - } + chand_->subchannel_wrappers_.erase(this); + auto* subchannel_node = subchannel_->channelz_node(); + if (subchannel_node != nullptr) { + auto it = chand_->subchannel_refcount_map_.find(subchannel_); + GPR_ASSERT(it != chand_->subchannel_refcount_map_.end()); + --it->second; + if (it->second == 0) { + chand_->channelz_node_->RemoveChildSubchannel(subchannel_node->uuid()); + chand_->subchannel_refcount_map_.erase(it); } - GRPC_SUBCHANNEL_UNREF(subchannel, "unref from LB"); - GRPC_CHANNEL_STACK_UNREF(chand->owning_stack_, "SubchannelWrapper"); - }, DEBUG_LOCATION); + } + GRPC_SUBCHANNEL_UNREF(subchannel_, "unref from LB"); + GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_, "SubchannelWrapper"); } grpc_connectivity_state CheckConnectivityState() override { @@ -1016,7 +1011,12 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { parent_(std::move(parent)), last_seen_state_(initial_state) {} - ~WatcherWrapper() { parent_.reset(DEBUG_LOCATION, "WatcherWrapper"); } + ~WatcherWrapper() { + auto* parent = parent_.release(); /* ref owned by lambda */ + parent->chand_->work_serializer_->Run( + [parent]() { parent->Unref(DEBUG_LOCATION, "WatcherWrapper"); }, + DEBUG_LOCATION); + } void OnConnectivityStateChange( grpc_connectivity_state new_state,