|
|
|
@ -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; |
|
|
|
|