int psmx_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr, struct fid_cntr **cntr, void *context) { struct psmx_fid_domain *domain_priv; struct psmx_fid_cntr *cntr_priv; struct psmx_fid_wait *wait = NULL; struct fi_wait_attr wait_attr; int events; uint64_t flags; int err; events = FI_CNTR_EVENTS_COMP; flags = 0; switch (attr->events) { case FI_CNTR_EVENTS_COMP: events = attr->events; break; default: psmx_debug("%s: attr->events=%d, supported=%d\n", __func__, attr->events, FI_CNTR_EVENTS_COMP); return -EINVAL; } switch (attr->wait_obj) { case FI_WAIT_NONE: case FI_WAIT_UNSPEC: break; case FI_WAIT_SET: if (!attr->wait_set) { psmx_debug("%s: FI_WAIT_SET is specified but attr->wait_set is NULL\n", __func__); return -FI_EINVAL; } wait = (struct psmx_fid_wait *)attr->wait_set; break; case FI_WAIT_FD: case FI_WAIT_MUT_COND: wait_attr.wait_obj = attr->wait_obj; wait_attr.flags = 0; err = psmx_wait_open(domain, &wait_attr, (struct fid_wait **)&wait); if (err) return err; break; default: psmx_debug("%s: attr->wait_obj=%d, supported=%d...%d\n", __func__, attr->wait_obj, FI_WAIT_NONE, FI_WAIT_MUT_COND); return -FI_EINVAL; } domain_priv = container_of(domain, struct psmx_fid_domain, domain); cntr_priv = (struct psmx_fid_cntr *) calloc(1, sizeof *cntr_priv); if (!cntr_priv) return -ENOMEM; cntr_priv->domain = domain_priv; cntr_priv->events = events; cntr_priv->wait = wait; cntr_priv->flags = flags; cntr_priv->cntr.fid.fclass = FI_CLASS_CNTR; cntr_priv->cntr.fid.context = context; cntr_priv->cntr.fid.ops = &psmx_fi_ops; cntr_priv->cntr.ops = &psmx_cntr_ops; pthread_mutex_init(&cntr_priv->trigger_lock, NULL); *cntr = &cntr_priv->cntr; return 0; }
int psmx_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr, struct fid_cntr **cntr, void *context) { struct psmx_fid_domain *domain_priv; struct psmx_fid_cntr *cntr_priv; struct psmx_fid_wait *wait = NULL; struct fi_wait_attr wait_attr; int wait_is_local = 0; int events; uint64_t flags; int err; events = FI_CNTR_EVENTS_COMP; flags = 0; domain_priv = container_of(domain, struct psmx_fid_domain, domain); switch (attr->events) { case FI_CNTR_EVENTS_COMP: events = attr->events; break; default: FI_INFO(&psmx_prov, FI_LOG_CQ, "attr->events=%d, supported=%d\n", attr->events, FI_CNTR_EVENTS_COMP); return -FI_EINVAL; } switch (attr->wait_obj) { case FI_WAIT_NONE: case FI_WAIT_UNSPEC: break; case FI_WAIT_SET: if (!attr->wait_set) { FI_INFO(&psmx_prov, FI_LOG_CQ, "FI_WAIT_SET is specified but attr->wait_set is NULL\n"); return -FI_EINVAL; } wait = (struct psmx_fid_wait *)attr->wait_set; break; case FI_WAIT_FD: case FI_WAIT_MUTEX_COND: wait_attr.wait_obj = attr->wait_obj; wait_attr.flags = 0; err = psmx_wait_open(&domain_priv->fabric->fabric, &wait_attr, (struct fid_wait **)&wait); if (err) return err; wait_is_local = 1; break; default: FI_INFO(&psmx_prov, FI_LOG_CQ, "attr->wait_obj=%d, supported=%d...%d\n", attr->wait_obj, FI_WAIT_NONE, FI_WAIT_MUTEX_COND); return -FI_EINVAL; } cntr_priv = (struct psmx_fid_cntr *) calloc(1, sizeof *cntr_priv); if (!cntr_priv) { err = -FI_ENOMEM; goto fail; } psmx_domain_acquire(domain_priv); cntr_priv->domain = domain_priv; cntr_priv->events = events; cntr_priv->wait = wait; cntr_priv->wait_is_local = wait_is_local; cntr_priv->flags = flags; cntr_priv->cntr.fid.fclass = FI_CLASS_CNTR; cntr_priv->cntr.fid.context = context; cntr_priv->cntr.fid.ops = &psmx_fi_ops; cntr_priv->cntr.ops = &psmx_cntr_ops; pthread_mutex_init(&cntr_priv->trigger_lock, NULL); *cntr = &cntr_priv->cntr; return 0; fail: if (wait && wait_is_local) fi_close(&wait->wait.fid); return err; }