static grpc_call_error start_ioreq(grpc_call *call, const grpc_ioreq *reqs, size_t nreqs, grpc_ioreq_completion_func completion, void *user_data) { size_t i; gpr_uint32 have_ops = 0; grpc_ioreq_op op; reqinfo_master *master; grpc_ioreq_data data; gpr_uint8 set; if (nreqs == 0) { return GRPC_CALL_OK; } set = reqs[0].op; for (i = 0; i < nreqs; i++) { op = reqs[i].op; if (call->request_set[op] < GRPC_IOREQ_OP_COUNT) { return start_ioreq_error(call, have_ops, GRPC_CALL_ERROR_TOO_MANY_OPERATIONS); } else if (call->request_set[op] == REQSET_DONE) { return start_ioreq_error(call, have_ops, GRPC_CALL_ERROR_ALREADY_INVOKED); } data = reqs[i].data; if (op == GRPC_IOREQ_SEND_INITIAL_METADATA || op == GRPC_IOREQ_SEND_TRAILING_METADATA) { if (!prepare_application_metadata(call, data.send_metadata.count, data.send_metadata.metadata)) { return start_ioreq_error(call, have_ops, GRPC_CALL_ERROR_INVALID_METADATA); } } have_ops |= 1u << op; call->request_data[op] = data; call->request_set[op] = set; } master = &call->masters[set]; master->success = 1; master->need_mask = have_ops; master->complete_mask = 0; master->on_complete = completion; master->user_data = user_data; finish_read_ops(call); early_out_write_ops(call); return GRPC_CALL_OK; }
static grpc_call_error start_ioreq(grpc_call *call, const grpc_ioreq *reqs, size_t nreqs, grpc_ioreq_completion_func completion, void *user_data) { size_t i; gpr_uint32 have_ops = 0; grpc_ioreq_op op; reqinfo_master *master; grpc_ioreq_data data; gpr_uint8 set; if (nreqs == 0) { return GRPC_CALL_OK; } set = reqs[0].op; for (i = 0; i < nreqs; i++) { op = reqs[i].op; if (call->request_set[op] < GRPC_IOREQ_OP_COUNT) { return start_ioreq_error(call, have_ops, GRPC_CALL_ERROR_TOO_MANY_OPERATIONS); } else if (call->request_set[op] == REQSET_DONE) { return start_ioreq_error(call, have_ops, GRPC_CALL_ERROR_ALREADY_INVOKED); } have_ops |= 1u << op; data = reqs[i].data; call->request_data[op] = data; call->request_set[op] = set; } master = &call->masters[set]; master->status = GRPC_OP_OK; master->need_mask = have_ops; master->complete_mask = 0; master->on_complete = completion; master->user_data = user_data; if (have_ops & (1u << GRPC_IOREQ_RECV_MESSAGE)) { call->need_more_data = 1; } finish_read_ops(call); early_out_write_ops(call); return GRPC_CALL_OK; }