diff --git a/src/core/ext/filters/channel_idle/channel_idle_filter.cc b/src/core/ext/filters/channel_idle/channel_idle_filter.cc index 880d10ab01c..f2cbd0befb4 100644 --- a/src/core/ext/filters/channel_idle/channel_idle_filter.cc +++ b/src/core/ext/filters/channel_idle/channel_idle_filter.cc @@ -61,7 +61,6 @@ const NoInterceptor ChannelIdleFilter::Call::OnServerInitialMetadata; const NoInterceptor ChannelIdleFilter::Call::OnServerTrailingMetadata; const NoInterceptor ChannelIdleFilter::Call::OnClientToServerMessage; const NoInterceptor ChannelIdleFilter::Call::OnServerToClientMessage; -const NoInterceptor ChannelIdleFilter::Call::OnFinalize; namespace { diff --git a/src/core/ext/filters/channel_idle/channel_idle_filter.h b/src/core/ext/filters/channel_idle/channel_idle_filter.h index 67caadfd5a7..f45d571c2cc 100644 --- a/src/core/ext/filters/channel_idle/channel_idle_filter.h +++ b/src/core/ext/filters/channel_idle/channel_idle_filter.h @@ -54,16 +54,20 @@ class ChannelIdleFilter : public ImplementChannelFilter { explicit Call(ChannelIdleFilter* filter) : filter_(filter) { filter_->IncreaseCallCount(); } - ~Call() { filter_->DecreaseCallCount(); } + ~Call() { MaybeDecrement(); } static const NoInterceptor OnClientInitialMetadata; static const NoInterceptor OnServerInitialMetadata; static const NoInterceptor OnServerTrailingMetadata; static const NoInterceptor OnClientToServerMessage; static const NoInterceptor OnServerToClientMessage; - static const NoInterceptor OnFinalize; + void OnFinalize(const grpc_call_final_info*) { MaybeDecrement(); } private: + void MaybeDecrement() { + auto* filter = std::exchange(filter_, nullptr); + if (filter != nullptr) filter->DecreaseCallCount(); + } ChannelIdleFilter* filter_; };