|
|
|
@ -212,6 +212,10 @@ finish: |
|
|
|
|
fd = nullptr; |
|
|
|
|
} |
|
|
|
|
done = (--ac->refs == 0); |
|
|
|
|
// Create a copy of the data from "ac" to be accessed after the unlock, as
|
|
|
|
|
// "ac" and its contents may be deallocated by the time they are read.
|
|
|
|
|
const grpc_slice addr_str_slice = grpc_slice_from_copied_string(ac->addr_str); |
|
|
|
|
gpr_mu_unlock(&ac->mu); |
|
|
|
|
if (error != GRPC_ERROR_NONE) { |
|
|
|
|
char* error_descr; |
|
|
|
|
grpc_slice str; |
|
|
|
@ -224,10 +228,12 @@ finish: |
|
|
|
|
gpr_free(error_descr); |
|
|
|
|
gpr_free(desc); |
|
|
|
|
error = grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, |
|
|
|
|
grpc_slice_from_copied_string(ac->addr_str)); |
|
|
|
|
addr_str_slice); |
|
|
|
|
grpc_slice_unref(addr_str_slice); |
|
|
|
|
} |
|
|
|
|
gpr_mu_unlock(&ac->mu); |
|
|
|
|
if (done) { |
|
|
|
|
// This is safe even outside the lock, because "done", the sentinel, is
|
|
|
|
|
// populated *inside* the lock.
|
|
|
|
|
gpr_mu_destroy(&ac->mu); |
|
|
|
|
gpr_free(ac->addr_str); |
|
|
|
|
grpc_channel_args_destroy(ac->channel_args); |
|
|
|
|