#include <stdlib.h>
#include <string.h>
#include <fi_enosys.h>
#include <fi_util.h>
int ofi_domain_close(struct util_domain *domain)
{
if (ofi_atomic_get32(&domain->ref))
return -FI_EBUSY;
fastlock_acquire(&domain->fabric->lock);
dlist_remove(&domain->list_entry);
fastlock_release(&domain->fabric->lock);
free(domain->name);
fastlock_destroy(&domain->lock);
ofi_atomic_dec32(&domain->fabric->ref);
return 0;
}
static struct fi_ops_mr util_domain_mr_ops = {
.size = sizeof(struct fi_ops_mr),
.reg = fi_no_mr_reg,
.regv = fi_no_mr_regv,
.regattr = fi_no_mr_regattr,
};
static int util_domain_init(struct util_domain *domain,
const struct fi_info *info)
{
ofi_atomic_initialize32(&domain->ref, 0);
fastlock_init(&domain->lock);
domain->info_domain_caps = info->caps | info->domain_attr->caps;
domain->info_domain_mode = info->mode | info->domain_attr->mode;
domain->mr_mode = info->domain_attr->mr_mode;
domain->addr_format = info->addr_format;
domain->av_type = info->domain_attr->av_type;
domain->name = strdup(info->domain_attr->name);
return domain->name ? 0 : -FI_ENOMEM;
}
int ofi_domain_init(struct fid_fabric *fabric_fid, const struct fi_info *info,
struct util_domain *domain, void *context)
{
struct util_fabric *fabric;
int ret;
fabric = container_of(fabric_fid, struct util_fabric, fabric_fid);
domain->fabric = fabric;
domain->prov = fabric->prov;
ret = util_domain_init(domain, info);
if (ret) {
free(domain);
return ret;
}
domain->domain_fid.fid.fclass = FI_CLASS_DOMAIN;
domain->domain_fid.fid.context = context;
domain->domain_fid.mr = &util_domain_mr_ops;
fastlock_acquire(&fabric->lock);
dlist_insert_tail(&domain->list_entry, &fabric->domain_list);
fastlock_release(&fabric->lock);
ofi_atomic_inc32(&fabric->ref);
return 0;
}