int rxm_endpoint(struct fid_domain *domain, struct fi_info *info, struct fid_ep **ep_fid, void *context) { struct util_domain *util_domain; struct rxm_ep *rxm_ep; int ret; rxm_ep = calloc(1, sizeof(*rxm_ep)); if (!rxm_ep) return -FI_ENOMEM; ret = ofi_endpoint_init(domain, &rxm_util_prov, info, &rxm_ep->util_ep, context, FI_MATCH_PREFIX); if (ret) goto err; util_domain = container_of(domain, struct util_domain, domain_fid); ret = rxm_ep_msg_res_open(info, util_domain, rxm_ep); if (ret) goto err; *ep_fid = &rxm_ep->util_ep.ep_fid; (*ep_fid)->fid.ops = &rxm_ep_fi_ops; (*ep_fid)->ops = &rxm_ep_ops; (*ep_fid)->cm = &rxm_cm_ops; (*ep_fid)->msg = &rxm_msg_ops; return 0; err: free(rxm_ep); return ret; }
int rxm_endpoint(struct fid_domain *domain, struct fi_info *info, struct fid_ep **ep_fid, void *context) { struct util_domain *util_domain; struct rxm_ep *rxm_ep; int ret; rxm_ep = calloc(1, sizeof(*rxm_ep)); if (!rxm_ep) return -FI_ENOMEM; if (!(rxm_ep->rxm_info = fi_dupinfo(info))) { ret = -FI_ENOMEM; goto err1; } ret = ofi_endpoint_init(domain, &rxm_util_prov, info, &rxm_ep->util_ep, context, &rxm_ep_progress, FI_MATCH_PREFIX); if (ret) goto err1; util_domain = container_of(domain, struct util_domain, domain_fid); ret = rxm_ep_msg_res_open(info, util_domain, rxm_ep); if (ret) goto err2; ret = rxm_ep_txrx_res_open(rxm_ep); if (ret) goto err3; *ep_fid = &rxm_ep->util_ep.ep_fid; (*ep_fid)->fid.ops = &rxm_ep_fi_ops; (*ep_fid)->ops = &rxm_ops_ep; (*ep_fid)->cm = &rxm_ops_cm; (*ep_fid)->msg = &rxm_ops_msg; (*ep_fid)->tagged = &rxm_ops_tagged; return 0; err3: rxm_ep_msg_res_close(rxm_ep); err2: ofi_endpoint_close(&rxm_ep->util_ep); err1: if (rxm_ep->rxm_info) fi_freeinfo(rxm_ep->rxm_info); free(rxm_ep); return ret; }