@ -456,20 +456,6 @@ void grpc_call_internal_ref(grpc_call *c) {
static void destroy_call ( void * call , int ignored_success ) {
size_t i ;
grpc_call * c = call ;
grpc_call * parent = c - > parent ;
if ( parent ) {
gpr_mu_lock ( & parent - > mu ) ;
if ( call = = parent - > first_child ) {
parent - > first_child = c - > sibling_next ;
if ( c = = parent - > first_child ) {
parent - > first_child = NULL ;
}
c - > sibling_prev - > sibling_next = c - > sibling_next ;
c - > sibling_next - > sibling_prev = c - > sibling_prev ;
}
gpr_mu_unlock ( & parent - > mu ) ;
GRPC_CALL_INTERNAL_UNREF ( parent , " child " , 1 ) ;
}
grpc_call_stack_destroy ( CALL_STACK_FROM_CALL ( c ) ) ;
GRPC_CHANNEL_INTERNAL_UNREF ( c - > channel , " call " ) ;
gpr_mu_destroy ( & c - > mu ) ;
@ -1257,6 +1243,22 @@ grpc_call_error grpc_call_start_ioreq_and_call_back(
void grpc_call_destroy ( grpc_call * c ) {
int cancel ;
grpc_call * parent = c - > parent ;
if ( parent ) {
gpr_mu_lock ( & parent - > mu ) ;
if ( c = = parent - > first_child ) {
parent - > first_child = c - > sibling_next ;
if ( c = = parent - > first_child ) {
parent - > first_child = NULL ;
}
c - > sibling_prev - > sibling_next = c - > sibling_next ;
c - > sibling_next - > sibling_prev = c - > sibling_prev ;
}
gpr_mu_unlock ( & parent - > mu ) ;
GRPC_CALL_INTERNAL_UNREF ( parent , " child " , 1 ) ;
}
lock ( c ) ;
GPR_ASSERT ( ! c - > destroy_called ) ;
c - > destroy_called = 1 ;