int psmx2_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric, void *context) { struct psmx2_fid_fabric *fabric_priv; int ret; FI_INFO(&psmx2_prov, FI_LOG_CORE, "\n"); if (strcmp(attr->name, PSMX2_FABRIC_NAME)) return -FI_ENODATA; if (psmx2_active_fabric) { psmx2_fabric_acquire(psmx2_active_fabric); *fabric = &psmx2_active_fabric->util_fabric.fabric_fid; return 0; } fabric_priv = calloc(1, sizeof(*fabric_priv)); if (!fabric_priv) return -FI_ENOMEM; ret = ofi_fabric_init(&psmx2_prov, &psmx2_fabric_attr, attr, &fabric_priv->util_fabric, context, FI_MATCH_EXACT); if (ret) { FI_INFO(&psmx2_prov, FI_LOG_CORE, "ofi_fabric_init returns %d\n", ret); free(fabric_priv); return ret; } /* fclass & context initialized in ofi_fabric_init */ fabric_priv->util_fabric.fabric_fid.fid.ops = &psmx2_fabric_fi_ops; fabric_priv->util_fabric.fabric_fid.ops = &psmx2_fabric_ops; psmx2_get_uuid(fabric_priv->uuid); if (psmx2_env.name_server) { ret = pthread_create(&fabric_priv->name_server_thread, NULL, psmx2_name_server, (void *)fabric_priv); if (ret) { FI_INFO(&psmx2_prov, FI_LOG_CORE, "pthread_create returns %d\n", ret); /* use the main thread's ID as invalid value for the new thread */ fabric_priv->name_server_thread = pthread_self(); } } psmx2_query_mpi(); /* take the reference to count for multiple fabric open calls */ psmx2_fabric_acquire(fabric_priv); *fabric = &fabric_priv->util_fabric.fabric_fid; psmx2_active_fabric = fabric_priv; return 0; }
int psmx2_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric, void *context) { struct psmx2_fid_fabric *fabric_priv; int ret; FI_INFO(&psmx2_prov, FI_LOG_CORE, "\n"); if (strcmp(attr->name, PSMX2_FABRIC_NAME)) return -FI_ENODATA; if (psmx2_active_fabric) { psmx2_fabric_acquire(psmx2_active_fabric); *fabric = &psmx2_active_fabric->util_fabric.fabric_fid; return 0; } fabric_priv = calloc(1, sizeof(*fabric_priv)); if (!fabric_priv) return -FI_ENOMEM; fastlock_init(&fabric_priv->domain_lock); dlist_init(&fabric_priv->domain_list); psmx2_get_uuid(fabric_priv->uuid); if (psmx2_env.name_server) { fabric_priv->name_server.port = psmx2_uuid_to_port(fabric_priv->uuid); fabric_priv->name_server.name_len = sizeof(struct psmx2_ep_name); fabric_priv->name_server.service_len = sizeof(int); fabric_priv->name_server.service_cmp = psmx2_ns_service_cmp; fabric_priv->name_server.is_service_wildcard = psmx2_ns_is_service_wildcard; ofi_ns_init(&fabric_priv->name_server); ofi_ns_start_server(&fabric_priv->name_server); } ret = ofi_fabric_init(&psmx2_prov, &psmx2_fabric_attr, attr, &fabric_priv->util_fabric, context); if (ret) { FI_INFO(&psmx2_prov, FI_LOG_CORE, "ofi_fabric_init returns %d\n", ret); if (psmx2_env.name_server) ofi_ns_stop_server(&fabric_priv->name_server); free(fabric_priv); return ret; } /* fclass & context initialized in ofi_fabric_init */ fabric_priv->util_fabric.fabric_fid.fid.ops = &psmx2_fabric_fi_ops; fabric_priv->util_fabric.fabric_fid.ops = &psmx2_fabric_ops; psmx2_atomic_global_init(); psmx2_query_mpi(); /* take the reference to count for multiple fabric open calls */ psmx2_fabric_acquire(fabric_priv); *fabric = &fabric_priv->util_fabric.fabric_fid; psmx2_active_fabric = fabric_priv; return 0; }