diff --git a/src/core/ext/client_config/client_channel.c b/src/core/ext/client_config/client_channel.c index 7c6b19d558c9939300b789a268738e22bbf038ca..0b220c04d49684869be9dc7d02779c3cf4acdb55 100644 --- a/src/core/ext/client_config/client_channel.c +++ b/src/core/ext/client_config/client_channel.c @@ -128,8 +128,8 @@ static void set_channel_connectivity_state_locked(grpc_exec_ctx *exec_ctx, /* mask= */ GRPC_INITIAL_METADATA_IGNORE_CONNECTIVITY, /* check= */ 0); } - grpc_connectivity_state_set(exec_ctx, &chand->state_tracker, state, - error, reason); + grpc_connectivity_state_set(exec_ctx, &chand->state_tracker, state, error, + reason); } static void on_lb_policy_state_changed_locked(grpc_exec_ctx *exec_ctx, @@ -228,8 +228,8 @@ static void cc_on_config_changed(grpc_exec_ctx *exec_ctx, void *arg, } if (error == GRPC_ERROR_NONE && chand->resolver) { - set_channel_connectivity_state_locked(exec_ctx, chand, state, GRPC_ERROR_REF(state_error), - "new_lb+resolver"); + set_channel_connectivity_state_locked( + exec_ctx, chand, state, GRPC_ERROR_REF(state_error), "new_lb+resolver"); if (lb_policy != NULL) { watch_lb_policy(exec_ctx, chand, lb_policy, state); } @@ -269,6 +269,7 @@ static void cc_on_config_changed(grpc_exec_ctx *exec_ctx, void *arg, } GRPC_CHANNEL_STACK_UNREF(exec_ctx, chand->owning_stack, "resolver"); + GRPC_ERROR_UNREF(state_error); } static void cc_start_transport_op(grpc_exec_ctx *exec_ctx, @@ -316,8 +317,8 @@ static void cc_start_transport_op(grpc_exec_ctx *exec_ctx, if (!chand->started_resolving) { grpc_closure_list_fail_all(&chand->waiting_for_config_closures, GRPC_ERROR_REF(op->disconnect_with_error)); - grpc_exec_ctx_enqueue_list(exec_ctx, &chand->waiting_for_config_closures, - NULL); + grpc_exec_ctx_enqueue_list(exec_ctx, + &chand->waiting_for_config_closures, NULL); } if (chand->lb_policy != NULL) { grpc_pollset_set_del_pollset_set(exec_ctx, diff --git a/src/core/lib/iomgr/closure.c b/src/core/lib/iomgr/closure.c index 866110d89cab9daf6370bc4fef7c42644785f9ce..0b6c3b25392ea6653ca53f71276fafb4c13a4ef4 100644 --- a/src/core/lib/iomgr/closure.c +++ b/src/core/lib/iomgr/closure.c @@ -43,7 +43,10 @@ void grpc_closure_init(grpc_closure *closure, grpc_iomgr_cb_func cb, void grpc_closure_list_append(grpc_closure_list *closure_list, grpc_closure *closure, grpc_error *error) { - if (closure == NULL) return; + if (closure == NULL) { + GRPC_ERROR_UNREF(error); + return; + } closure->error = error; closure->next_data.next = NULL; if (closure_list->head == NULL) { diff --git a/src/core/lib/iomgr/error.c b/src/core/lib/iomgr/error.c index cc0265737a37b269f52fa3336d67f24fda16de55..d67eb6e425280f9655d86bce775dae29dd410614 100644 --- a/src/core/lib/iomgr/error.c +++ b/src/core/lib/iomgr/error.c @@ -158,10 +158,11 @@ static bool is_special(grpc_error *err) { err == GRPC_ERROR_CANCELLED; } -grpc_error *grpc_error_ref(grpc_error *err, const char *file, int line) { +grpc_error *grpc_error_ref(grpc_error *err, const char *file, int line, + const char *func) { if (is_special(err)) return err; - gpr_log(GPR_DEBUG, "%p: %d -> %d [%s:%d]", err, err->refs.count, - err->refs.count + 1, file, line); + gpr_log(GPR_DEBUG, "%p: %d -> %d [%s:%d %s]", err, err->refs.count, + err->refs.count + 1, file, line, func); gpr_ref(&err->refs); return err; } @@ -175,10 +176,11 @@ static void error_destroy(grpc_error *err) { gpr_free(err); } -void grpc_error_unref(grpc_error *err, const char *file, int line) { +void grpc_error_unref(grpc_error *err, const char *file, int line, + const char *func) { if (is_special(err)) return; - gpr_log(GPR_DEBUG, "%p: %d -> %d [%s:%d]", err, err->refs.count, - err->refs.count - 1, file, line); + gpr_log(GPR_DEBUG, "%p: %d -> %d [%s:%d %s]", err, err->refs.count, + err->refs.count - 1, file, line, func); if (gpr_unref(&err->refs)) { error_destroy(err); } @@ -191,6 +193,7 @@ grpc_error *grpc_error_create(const char *file, int line, const char *desc, if (err == NULL) { // TODO(ctiller): make gpr_malloc return NULL return GRPC_ERROR_OOM; } + gpr_log(GPR_DEBUG, "%p create [%s:%d]", err, file, line); err->ints = gpr_avl_add(gpr_avl_create(&avl_vtable_ints), (void *)(uintptr_t)GRPC_ERROR_INT_FILE_LINE, (void *)(uintptr_t)line); diff --git a/src/core/lib/iomgr/error.h b/src/core/lib/iomgr/error.h index 2b56aede7566d42526279bf340e47639cfc5e0b2..266a621704d6676dabc811e2ce4dec23da8dc685 100644 --- a/src/core/lib/iomgr/error.h +++ b/src/core/lib/iomgr/error.h @@ -97,10 +97,13 @@ grpc_error *grpc_error_create(const char *file, int line, const char *desc, #define GRPC_ERROR_CREATE_REFERENCING(desc, errs, count) \ grpc_error_create(__FILE__, __LINE__, desc, errs, count) -grpc_error *grpc_error_ref(grpc_error *err, const char *file, int line); -void grpc_error_unref(grpc_error *err, const char *file, int line); -#define GRPC_ERROR_REF(err) grpc_error_ref(err, __FILE__, __LINE__) -#define GRPC_ERROR_UNREF(err) grpc_error_unref(err, __FILE__, __LINE__) +grpc_error *grpc_error_ref(grpc_error *err, const char *file, int line, + const char *func); +void grpc_error_unref(grpc_error *err, const char *file, int line, + const char *func); +#define GRPC_ERROR_REF(err) grpc_error_ref(err, __FILE__, __LINE__, __func__) +#define GRPC_ERROR_UNREF(err) \ + grpc_error_unref(err, __FILE__, __LINE__, __func__) grpc_error *grpc_error_set_int(grpc_error *src, grpc_error_ints which, intptr_t value); diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index 66bdb7b213c5b4d1585b160a5b9d424f154cceaf..1ad635710a5fa8183c4029e3214c07fa6bd92dc4 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -1119,6 +1119,8 @@ static void finish_batch(grpc_exec_ctx *exec_ctx, void *bctlp, grpc_call *child_call; grpc_call *next_child_call; + GRPC_ERROR_REF(error); + gpr_mu_lock(&call->mu); if (bctl->send_initial_metadata) { if (error != GRPC_ERROR_NONE) { @@ -1170,7 +1172,7 @@ static void finish_batch(grpc_exec_ctx *exec_ctx, void *bctlp, GRPC_ERROR_UNREF(error); error = GRPC_ERROR_NONE; } - bctl->error = GRPC_ERROR_REF(error); + bctl->error = error; gpr_mu_unlock(&call->mu); if (gpr_unref(&bctl->steps_to_complete)) { post_batch_completion(exec_ctx, bctl);