It's used in destroy_stream:
while (t->calling_back) {
gpr_cv_wait(&t->cv, &t->mu, gpr_inf_future);
}
... and this turns out to be a huge source of contention.
It's additionally used in destroy_transport similarly, but I suspect unnecessarily in both cases.
Instead we should arrange reference counting at appropriate layers to ensure these objects survive until a termination event has been sent up the stack, and adjust our guarantees to not call these destroy functions until such events have been observed.