static ucs_status_t ucp_address_gather_devices(ucp_worker_h worker, uint64_t tl_bitmap, int has_ep, ucp_address_packed_device_t **devices_p, ucp_rsc_index_t *num_devices_p) { ucp_context_h context = worker->context; ucp_address_packed_device_t *dev, *devices; uct_iface_attr_t *iface_attr; ucp_rsc_index_t num_devices; ucp_rsc_index_t i; uint64_t mask; devices = ucs_calloc(context->num_tls, sizeof(*devices), "packed_devices"); if (devices == NULL) { return UCS_ERR_NO_MEMORY; } num_devices = 0; for (i = 0; i < context->num_tls; ++i) { mask = UCS_BIT(i); if (!(mask & tl_bitmap)) { continue; } dev = ucp_address_get_device(context->tl_rscs[i].tl_rsc.dev_name, devices, &num_devices); iface_attr = &worker->iface_attrs[i]; if (iface_attr->cap.flags & UCT_IFACE_FLAG_CONNECT_TO_IFACE) { dev->tl_addrs_size += iface_attr->iface_addr_len; } else if (iface_attr->cap.flags & UCT_IFACE_FLAG_CONNECT_TO_EP) { if (has_ep) { dev->tl_addrs_size += iface_attr->ep_addr_len; } else { /* Empty address */ } } else { continue; } dev->rsc_index = i; dev->dev_addr_len = iface_attr->device_addr_len; dev->tl_bitmap |= mask; dev->tl_addrs_size += 1; /* address length */ dev->tl_addrs_size += ucp_address_string_packed_size(context->tl_rscs[i].tl_rsc.tl_name); } *devices_p = devices; *num_devices_p = num_devices; return UCS_OK; }
static size_t ucp_address_packed_size(ucp_worker_h worker, const ucp_address_packed_device_t *devices, ucp_rsc_index_t num_devices) { const ucp_address_packed_device_t *dev; size_t size; size = sizeof(uint64_t) + ucp_address_string_packed_size(ucp_worker_get_name(worker)); if (num_devices == 0) { size += 1; /* NULL md_index */ } else { for (dev = devices; dev < devices + num_devices; ++dev) { size += 1; /* device md_index */ size += 1; /* device address length */ size += dev->dev_addr_len; /* device address */ size += dev->tl_addrs_size; /* transport addresses */ } } return size; }