int pmix_mca_base_var_group_component_register (const pmix_mca_base_component_t *component, const char *description) { /* 1.7 components do not store the project */ return group_register (NULL, component->pmix_mca_type_name, component->pmix_mca_component_name, description); }
static int group_register (const char *project_name, const char *framework_name, const char *component_name, const char *description) { pmix_mca_base_var_group_t *group; int group_id, parent_id = -1; int ret; if (NULL == project_name && NULL == framework_name && NULL == component_name) { /* don't create a group with no name (maybe we should create a generic group?) */ return -1; } /* avoid groups of the form pmix_pmix, etc */ if (NULL != project_name && NULL != framework_name && (0 == strcmp (project_name, framework_name))) { project_name = NULL; } group_id = group_find (project_name, framework_name, component_name, true); if (0 <= group_id) { ret = pmix_mca_base_var_group_get_internal (group_id, &group, true); if (PMIX_SUCCESS != ret) { /* something went horribly wrong */ assert (NULL != group); return ret; } group->group_isvalid = true; pmix_mca_base_var_groups_timestamp++; /* group already exists. return it's index */ return group_id; } group = PMIX_NEW(pmix_mca_base_var_group_t); group->group_isvalid = true; if (NULL != project_name) { group->group_project = strdup (project_name); if (NULL == group->group_project) { PMIX_RELEASE(group); return PMIX_ERR_OUT_OF_RESOURCE; } } if (NULL != framework_name) { group->group_framework = strdup (framework_name); if (NULL == group->group_framework) { PMIX_RELEASE(group); return PMIX_ERR_OUT_OF_RESOURCE; } } if (NULL != component_name) { group->group_component = strdup (component_name); if (NULL == group->group_component) { PMIX_RELEASE(group); return PMIX_ERR_OUT_OF_RESOURCE; } } if (NULL != description) { group->group_description = strdup (description); if (NULL == group->group_description) { PMIX_RELEASE(group); return PMIX_ERR_OUT_OF_RESOURCE; } } if (NULL != framework_name && NULL != component_name) { parent_id = group_register (project_name, framework_name, NULL, NULL); } /* build the group name */ ret = pmix_mca_base_var_generate_full_name4 (NULL, project_name, framework_name, component_name, &group->group_full_name); if (PMIX_SUCCESS != ret) { PMIX_RELEASE(group); return ret; } group_id = pmix_pointer_array_add (&pmix_mca_base_var_groups, group); if (0 > group_id) { PMIX_RELEASE(group); return PMIX_ERROR; } pmix_hash_table_set_value_ptr (&pmix_mca_base_var_group_index_hash, group->group_full_name, strlen (group->group_full_name), (void *)(uintptr_t) group_id); pmix_mca_base_var_group_count++; pmix_mca_base_var_groups_timestamp++; if (0 <= parent_id) { pmix_mca_base_var_group_t *parent_group; (void) pmix_mca_base_var_group_get_internal(parent_id, &parent_group, false); pmix_value_array_append_item (&parent_group->group_subgroups, &group_id); } return group_id; }
int pmix_mca_base_var_group_register (const char *project_name, const char *framework_name, const char *component_name, const char *description) { return group_register (project_name, framework_name, component_name, description); }
static int group_register (const char *project_name, const char *framework_name, const char *component_name, const char *description) { ocoms_mca_base_var_group_t *group; int group_id, parent_id = -1; int ret; if (NULL == project_name && NULL == framework_name && NULL == component_name) { /* don't create a group with no name (maybe we should create a generic group?) */ return -1; } /* XXX -- remove this once the project name is available in the component structure */ if (framework_name || component_name) { project_name = NULL; } group_id = group_find (project_name, framework_name, component_name, true); if (0 <= group_id) { (void) ocoms_mca_base_var_group_get_internal (group_id, &group, true); group->group_isvalid = true; ocoms_mca_base_var_groups_timestamp++; /* group already exists. return it's index */ return group_id; } group = OBJ_NEW(ocoms_mca_base_var_group_t); group->group_isvalid = true; if (NULL != project_name) { group->group_project = strdup (project_name); if (NULL == group->group_project) { OBJ_RELEASE(group); return OCOMS_ERR_OUT_OF_RESOURCE; } } if (NULL != framework_name) { group->group_framework = strdup (framework_name); if (NULL == group->group_framework) { OBJ_RELEASE(group); return OCOMS_ERR_OUT_OF_RESOURCE; } } if (NULL != component_name) { group->group_component = strdup (component_name); if (NULL == group->group_component) { OBJ_RELEASE(group); return OCOMS_ERR_OUT_OF_RESOURCE; } } if (NULL != description) { group->group_description = strdup (description); if (NULL == group->group_description) { OBJ_RELEASE(group); return OCOMS_ERR_OUT_OF_RESOURCE; } } if (NULL != framework_name && NULL != component_name) { if (component_name) { parent_id = group_register (project_name, framework_name, NULL, NULL); } else if (framework_name && project_name) { parent_id = group_register (project_name, NULL, NULL, NULL); } } /* avoid groups of the form ocoms_ocoms, ompi_ompi, etc */ if (NULL != project_name && NULL != framework_name && (0 == strcmp (project_name, framework_name))) { project_name = NULL; } /* build the group name */ ret = ocoms_mca_base_var_generate_full_name4 (NULL, project_name, framework_name, component_name, &group->group_full_name); if (OCOMS_SUCCESS != ret) { OBJ_RELEASE(group); return ret; } group_id = ocoms_pointer_array_add (&ocoms_mca_base_var_groups, group); if (0 > group_id) { OBJ_RELEASE(group); return OCOMS_ERROR; } ocoms_hash_table_set_value_ptr (&ocoms_mca_base_var_group_index_hash, group->group_full_name, strlen (group->group_full_name), (void *)(uintptr_t) group_id); ocoms_mca_base_var_group_count++; ocoms_mca_base_var_groups_timestamp++; if (0 <= parent_id) { ocoms_mca_base_var_group_t *parent_group; (void) ocoms_mca_base_var_group_get_internal(parent_id, &parent_group, false); ocoms_value_array_append_item (&parent_group->group_subgroups, &group_id); } return group_id; }