in dissociated-ipc/ucx_conn.cc [312:344]
arrow::Status Connection::SendTagIov(ucp_tag_t tag, const ucp_dt_iov_t* iov,
const size_t iov_cnt, void* user_data,
ucp_send_nbx_callback_t cb,
const ucs_memory_type_t memory_type) {
ARROW_RETURN_NOT_OK(CheckClosed());
ucp_request_param_t request_param;
request_param.op_attr_mask = UCP_OP_ATTR_FIELD_DATATYPE | UCP_OP_ATTR_FIELD_MEMORY_TYPE;
request_param.datatype = UCP_DATATYPE_IOV;
if (cb) {
request_param.cb.send = cb;
request_param.op_attr_mask |= UCP_OP_ATTR_FIELD_CALLBACK;
}
if (user_data) {
request_param.user_data = user_data;
request_param.op_attr_mask |= UCP_OP_ATTR_FIELD_USER_DATA;
}
request_param.memory_type = memory_type;
void* request = ucp_tag_send_nbx(remote_endpoint_, iov, iov_cnt, tag, &request_param);
if (!request) {
// request completed immediately, call the cb manually if it exists
// since it won't be called automatically
if (cb) cb(request, UCS_OK, user_data);
} else if (UCS_PTR_IS_ERR(request)) {
// same thing, call it manually
auto status = UCS_PTR_STATUS(request);
if (cb) cb(request, status, user_data);
return utils::FromUcsStatus("ucp_tag_send_nbx", status);
}
return arrow::Status::OK();
}