|
|
|
@ -74,7 +74,7 @@ |
|
|
|
|
#define ESTIMATED_MDELEM_COUNT 16 |
|
|
|
|
|
|
|
|
|
struct batch_control { |
|
|
|
|
batch_control() { gpr_ref_init(&steps_to_complete, 0); } |
|
|
|
|
batch_control() = default; |
|
|
|
|
|
|
|
|
|
grpc_call* call = nullptr; |
|
|
|
|
grpc_transport_stream_op_batch op; |
|
|
|
@ -99,8 +99,14 @@ struct batch_control { |
|
|
|
|
} completion_data; |
|
|
|
|
grpc_closure start_batch; |
|
|
|
|
grpc_closure finish_batch; |
|
|
|
|
gpr_refcount steps_to_complete; |
|
|
|
|
grpc_core::Atomic<intptr_t> steps_to_complete; |
|
|
|
|
gpr_atm batch_error = reinterpret_cast<gpr_atm>(GRPC_ERROR_NONE); |
|
|
|
|
void set_num_steps_to_complete(uintptr_t steps) { |
|
|
|
|
steps_to_complete.Store(steps, grpc_core::MemoryOrder::RELEASE); |
|
|
|
|
} |
|
|
|
|
bool completed_batch_step() { |
|
|
|
|
return steps_to_complete.FetchSub(1, grpc_core::MemoryOrder::ACQ_REL) == 1; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct parent_call { |
|
|
|
@ -1225,7 +1231,7 @@ static void post_batch_completion(batch_control* bctl) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void finish_batch_step(batch_control* bctl) { |
|
|
|
|
if (GPR_UNLIKELY(gpr_unref(&bctl->steps_to_complete))) { |
|
|
|
|
if (GPR_UNLIKELY(bctl->completed_batch_step())) { |
|
|
|
|
post_batch_completion(bctl); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1866,7 +1872,7 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops, |
|
|
|
|
if (!is_notify_tag_closure) { |
|
|
|
|
GPR_ASSERT(grpc_cq_begin_op(call->cq, notify_tag)); |
|
|
|
|
} |
|
|
|
|
gpr_ref_init(&bctl->steps_to_complete, (has_send_ops ? 1 : 0) + num_recv_ops); |
|
|
|
|
bctl->set_num_steps_to_complete((has_send_ops ? 1 : 0) + num_recv_ops); |
|
|
|
|
|
|
|
|
|
if (has_send_ops) { |
|
|
|
|
GRPC_CLOSURE_INIT(&bctl->finish_batch, finish_batch, bctl, |
|
|
|
|