|
|
|
@ -161,8 +161,8 @@ struct grpc_call { |
|
|
|
|
bool received_initial_metadata; |
|
|
|
|
bool receiving_message; |
|
|
|
|
bool requested_final_op; |
|
|
|
|
bool received_final_op; |
|
|
|
|
gpr_atm num_ops_sent; |
|
|
|
|
gpr_atm any_ops_sent_atm; |
|
|
|
|
gpr_atm received_final_op_atm; |
|
|
|
|
|
|
|
|
|
/* have we received initial metadata */ |
|
|
|
|
bool has_initial_md_been_received; |
|
|
|
@ -458,7 +458,7 @@ static void destroy_call(grpc_exec_ctx *exec_ctx, void *call, |
|
|
|
|
|
|
|
|
|
for (i = 0; i < STATUS_SOURCE_COUNT; i++) { |
|
|
|
|
GRPC_ERROR_UNREF( |
|
|
|
|
unpack_received_status(gpr_atm_no_barrier_load(&c->status[i])).error); |
|
|
|
|
unpack_received_status(gpr_atm_acq_load(&c->status[i])).error); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grpc_call_stack_destroy(exec_ctx, CALL_STACK_FROM_CALL(c), &c->final_info, c); |
|
|
|
@ -490,7 +490,7 @@ void grpc_call_destroy(grpc_call *c) { |
|
|
|
|
|
|
|
|
|
GPR_ASSERT(!c->destroy_called); |
|
|
|
|
c->destroy_called = 1; |
|
|
|
|
cancel = gpr_atm_no_barrier_load(&c->num_ops_sent) && !c->received_final_op; |
|
|
|
|
cancel = gpr_atm_acq_load(&c->any_ops_sent_atm) && !gpr_atm_acq_load(&c->received_final_op_atm); |
|
|
|
|
if (cancel) { |
|
|
|
|
cancel_with_error(&exec_ctx, c, STATUS_FROM_API_OVERRIDE, |
|
|
|
|
GRPC_ERROR_CANCELLED); |
|
|
|
@ -1048,7 +1048,7 @@ static void finish_batch_completion(grpc_exec_ctx *exec_ctx, void *user_data, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static grpc_error *consolidate_batch_errors(batch_control *bctl) { |
|
|
|
|
size_t n = (size_t)gpr_atm_no_barrier_load(&bctl->num_errors); |
|
|
|
|
size_t n = (size_t)gpr_atm_acq_load(&bctl->num_errors); |
|
|
|
|
if (n == 0) { |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} else if (n == 1) { |
|
|
|
@ -1093,7 +1093,7 @@ static void post_batch_completion(grpc_exec_ctx *exec_ctx, |
|
|
|
|
&call->metadata_batch[1 /* is_receiving */][1 /* is_trailing */]; |
|
|
|
|
recv_trailing_filter(exec_ctx, call, md); |
|
|
|
|
|
|
|
|
|
call->received_final_op = true; |
|
|
|
|
gpr_atm_rel_store(&call->received_final_op_atm, 1); |
|
|
|
|
/* propagate cancellation to any interested children */ |
|
|
|
|
if (gpr_atm_acq_load(&call->has_children)) { |
|
|
|
|
gpr_mu_lock(&call->child_list_mu); |
|
|
|
@ -1286,7 +1286,7 @@ static void validate_filtered_metadata(grpc_exec_ctx *exec_ctx, |
|
|
|
|
static void add_batch_error(grpc_exec_ctx *exec_ctx, batch_control *bctl, |
|
|
|
|
grpc_error *error, bool has_cancelled) { |
|
|
|
|
if (error == GRPC_ERROR_NONE) return; |
|
|
|
|
int idx = (int)gpr_atm_no_barrier_fetch_add(&bctl->num_errors, 1); |
|
|
|
|
int idx = (int)gpr_atm_full_fetch_add(&bctl->num_errors, 1); |
|
|
|
|
if (idx == 0 && !has_cancelled) { |
|
|
|
|
cancel_with_error(exec_ctx, bctl->call, STATUS_FROM_CORE, |
|
|
|
|
GRPC_ERROR_REF(error)); |
|
|
|
@ -1664,7 +1664,7 @@ static grpc_call_error call_start_batch(grpc_exec_ctx *exec_ctx, |
|
|
|
|
grpc_closure_init(&bctl->finish_batch, finish_batch, bctl, |
|
|
|
|
grpc_schedule_on_exec_ctx); |
|
|
|
|
stream_op->on_complete = &bctl->finish_batch; |
|
|
|
|
gpr_atm_no_barrier_fetch_add(&call->num_ops_sent, 1); |
|
|
|
|
gpr_atm_rel_store(&call->any_ops_sent_atm, 1); |
|
|
|
|
|
|
|
|
|
execute_op(exec_ctx, call, stream_op); |
|
|
|
|
|
|
|
|
|