arrow::Status Connection::SendTagIov()

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();
}