diff --git a/src/core/surface/call.c b/src/core/surface/call.c index 7a9fe30732f..e80cf9e2939 100644 --- a/src/core/surface/call.c +++ b/src/core/surface/call.c @@ -300,7 +300,7 @@ grpc_call *grpc_call_create(grpc_channel *channel, grpc_completion_queue *cq, initial_op.on_done_recv = call_on_done_recv; initial_op.recv_user_data = call; call->receiving = 1; - grpc_call_internal_ref(call); + grpc_call_internal_ref(call, "receiving-0"); initial_op_ptr = &initial_op; } grpc_call_stack_init(channel_stack, server_transport_data, initial_op_ptr, @@ -320,7 +320,9 @@ grpc_completion_queue *grpc_call_get_completion_queue(grpc_call *call) { return call->cq; } -void grpc_call_internal_ref(grpc_call *c) { gpr_ref(&c->internal_refcount); } +void grpc_call_internal_ref(grpc_call *c, const char *reason) { +gpr_log(GPR_DEBUG, "grpc_call_internal_ref: %p %s %d -> %d", c, reason, c->internal_refcount.count, c->internal_refcount.count+1); + gpr_ref(&c->internal_refcount); } static void destroy_call(void *call, int ignored_success) { size_t i; @@ -353,7 +355,8 @@ static void destroy_call(void *call, int ignored_success) { gpr_free(c); } -void grpc_call_internal_unref(grpc_call *c, int allow_immediate_deletion) { +void grpc_call_internal_unref(grpc_call *c, const char *reason, int allow_immediate_deletion) { +gpr_log(GPR_DEBUG, "grpc_call_internal_unref: %p %s %d -> %d", c, reason, c->internal_refcount.count, c->internal_refcount.count-1); if (gpr_unref(&c->internal_refcount)) { if (allow_immediate_deletion) { destroy_call(c, 1); @@ -412,8 +415,7 @@ static int need_more_data(grpc_call *call) { is_op_live(call, GRPC_IOREQ_RECV_STATUS) || is_op_live(call, GRPC_IOREQ_RECV_STATUS_DETAILS) || is_op_live(call, GRPC_IOREQ_RECV_CLOSE) || - (call->write_state == WRITE_STATE_INITIAL && !call->is_client && - call->read_state != READ_STATE_STREAM_CLOSED); + (call->write_state == WRITE_STATE_INITIAL && !call->is_client && call->read_state != READ_STATE_STREAM_CLOSED); } static void unlock(grpc_call *call) { @@ -431,14 +433,14 @@ static void unlock(grpc_call *call) { op.on_done_recv = call_on_done_recv; op.recv_user_data = call; call->receiving = 1; - grpc_call_internal_ref(call); + grpc_call_internal_ref(call, "receiving"); start_op = 1; } if (!call->sending) { if (fill_send_ops(call, &op)) { call->sending = 1; - grpc_call_internal_ref(call); + grpc_call_internal_ref(call, "sending"); start_op = 1; } } @@ -449,7 +451,7 @@ static void unlock(grpc_call *call) { sizeof(completed_requests)); call->num_completed_requests = 0; call->completing = 1; - grpc_call_internal_ref(call); + grpc_call_internal_ref(call, "completing"); } gpr_mu_unlock(&call->mu); @@ -466,7 +468,7 @@ static void unlock(grpc_call *call) { lock(call); call->completing = 0; unlock(call); - grpc_call_internal_unref(call, 0); + grpc_call_internal_unref(call, "completing", 0); } } @@ -606,7 +608,7 @@ static void call_on_done_send(void *pc, int success) { call->last_send_contains = 0; call->sending = 0; unlock(call); - grpc_call_internal_unref(call, 0); + grpc_call_internal_unref(call, "sending", 0); } static void finish_message(grpc_call *call) { @@ -687,6 +689,7 @@ static void call_on_done_recv(void *pc, int success) { grpc_call *call = pc; size_t i; int unref_due_to_connection_close = 0; + gpr_log(GPR_DEBUG, "%s %p", __FUNCTION__, call); lock(call); call->receiving = 0; if (success) { @@ -727,9 +730,9 @@ static void call_on_done_recv(void *pc, int success) { call->recv_ops.nops = 0; unlock(call); - grpc_call_internal_unref(call, 0); + grpc_call_internal_unref(call, "receiving", 0); if (unref_due_to_connection_close) { - grpc_call_internal_unref(call, 0); + grpc_call_internal_unref(call, "live", 0); } } @@ -988,7 +991,7 @@ void grpc_call_destroy(grpc_call *c) { cancel = c->read_state != READ_STATE_STREAM_CLOSED; unlock(c); if (cancel) grpc_call_cancel(c); - grpc_call_internal_unref(c, 1); + grpc_call_internal_unref(c, "destroy", 1); } grpc_call_error grpc_call_cancel(grpc_call *call) { @@ -1035,7 +1038,7 @@ static void call_alarm(void *arg, int success) { grpc_call_cancel(call); } } - grpc_call_internal_unref(call, 1); + grpc_call_internal_unref(call, "alarm", 1); } static void set_deadline_alarm(grpc_call *call, gpr_timespec deadline) { @@ -1044,7 +1047,7 @@ static void set_deadline_alarm(grpc_call *call, gpr_timespec deadline) { assert(0); return; } - grpc_call_internal_ref(call); + grpc_call_internal_ref(call, "alarm"); call->have_alarm = 1; grpc_alarm_init(&call->alarm, deadline, call_alarm, call, gpr_now()); } diff --git a/src/core/surface/call.h b/src/core/surface/call.h index 199beb17386..f0c31e3a0d0 100644 --- a/src/core/surface/call.h +++ b/src/core/surface/call.h @@ -93,8 +93,8 @@ grpc_call *grpc_call_create(grpc_channel *channel, grpc_completion_queue *cq, void grpc_call_set_completion_queue(grpc_call *call, grpc_completion_queue *cq); grpc_completion_queue *grpc_call_get_completion_queue(grpc_call *call); -void grpc_call_internal_ref(grpc_call *call); -void grpc_call_internal_unref(grpc_call *call, int allow_immediate_deletion); +void grpc_call_internal_ref(grpc_call *call, const char *reason); +void grpc_call_internal_unref(grpc_call *call, const char *reason, int allow_immediate_deletion); grpc_call_error grpc_call_start_ioreq_and_call_back( grpc_call *call, const grpc_ioreq *reqs, size_t nreqs, diff --git a/src/core/surface/completion_queue.c b/src/core/surface/completion_queue.c index 24f4a05071a..4398c43f5ef 100644 --- a/src/core/surface/completion_queue.c +++ b/src/core/surface/completion_queue.c @@ -135,7 +135,7 @@ static event *add_locked(grpc_completion_queue *cc, grpc_completion_type type, void grpc_cq_begin_op(grpc_completion_queue *cc, grpc_call *call, grpc_completion_type type) { gpr_ref(&cc->refs); - if (call) grpc_call_internal_ref(call); + if (call) grpc_call_internal_ref(call, "cq"); #ifndef NDEBUG gpr_atm_no_barrier_fetch_add(&cc->pending_op_count[type], 1); #endif @@ -409,7 +409,7 @@ void grpc_event_finish(grpc_event *base) { event *ev = (event *)base; ev->on_finish(ev->on_finish_user_data, GRPC_OP_OK); if (ev->base.call) { - grpc_call_internal_unref(ev->base.call, 1); + grpc_call_internal_unref(ev->base.call, "cq", 1); } gpr_free(ev); } diff --git a/src/core/surface/server.c b/src/core/surface/server.c index 2f00ad0bc6c..254a1a64bd2 100644 --- a/src/core/surface/server.c +++ b/src/core/surface/server.c @@ -1131,7 +1131,7 @@ static void begin_call(grpc_server *server, call_data *calld, break; } - grpc_call_internal_ref(calld->call); + grpc_call_internal_ref(calld->call, "server"); grpc_call_start_ioreq_and_call_back(calld->call, req, r - req, publish, rc->tag); }