📄 mca_base_param.c
字号:
ret = strdup(array[id].mbp_env_var_name); } else { len = strlen(mca_prefix) + strlen(type) + 16; if (NULL != component) { len += strlen(component); } if (NULL != param) { len += strlen(param); } name = (char*)malloc(len); if (NULL == name) { return NULL; } name[0] = '\0'; snprintf(name, len, "%s%s", mca_prefix, type); if (NULL != component) { strcat(name, "_"); strcat(name, component); } if (NULL != param) { strcat(name, "_"); strcat(name, param); } ret = name; } /* All done */ return ret;}/* * Find the index for an MCA parameter based on its names. */int mca_base_param_find(const char *type_name, const char *component_name, const char *param_name) { size_t i, size; mca_base_param_t *array; /* Check for bozo cases */ if (!initialized) { return OPAL_ERROR; } /* Loop through looking for a parameter of a given type/component/param */ size = opal_value_array_get_size(&mca_base_params); array = OPAL_VALUE_ARRAY_GET_BASE(&mca_base_params, mca_base_param_t); for (i = 0; i < size; ++i) { if (((NULL == type_name && NULL == array[i].mbp_type_name) || (NULL != type_name && NULL != array[i].mbp_type_name && (0 == strcmp(type_name, array[i].mbp_type_name)))) && ((NULL == component_name && NULL == array[i].mbp_component_name) || (NULL != component_name && NULL != array[i].mbp_component_name && 0 == strcmp(component_name, array[i].mbp_component_name))) && ((NULL == param_name && NULL == array[i].mbp_param_name) || (NULL != param_name && NULL != array[i].mbp_param_name && 0 == strcmp(param_name, array[i].mbp_param_name)))) { return (int)i; } } /* Didn't find it */ return OPAL_ERROR;}int mca_base_param_set_internal(int index, bool internal){ size_t len; mca_base_param_t *array; /* Check for bozo cases */ if (!initialized) { return OPAL_ERROR; } len = opal_value_array_get_size(&mca_base_params); if (((size_t) index) > len) { return OPAL_ERROR; } /* We have a valid entry (remember that we never delete MCA parameters, so if the index is >0 and <len, it must be good), so save the internal flag */ array = OPAL_VALUE_ARRAY_GET_BASE(&mca_base_params, mca_base_param_t); array[index].mbp_internal = internal; /* All done */ return OPAL_SUCCESS;}/* * Return a list of info of all currently registered parameters */int mca_base_param_dump(opal_list_t **info, bool internal){ size_t i, len; mca_base_param_info_t *p; mca_base_param_t *array; /* Check for bozo cases */ if (!initialized) { return OPAL_ERROR; } if (NULL == info) { return OPAL_ERROR; } *info = OBJ_NEW(opal_list_t); /* Iterate through all the registered parameters */ len = opal_value_array_get_size(&mca_base_params); array = OPAL_VALUE_ARRAY_GET_BASE(&mca_base_params, mca_base_param_t); for (i = 0; i < len; ++i) { if(array[i].mbp_internal == internal || internal) { p = OBJ_NEW(mca_base_param_info_t); p->mbpp_index = (int)i; p->mbpp_type_name = array[i].mbp_type_name; p->mbpp_component_name = array[i].mbp_component_name; p->mbpp_param_name = array[i].mbp_param_name; p->mbpp_full_name = array[i].mbp_full_name; p->mbpp_read_only = array[i].mbp_read_only; p->mbpp_type = array[i].mbp_type; p->mbpp_help_msg = array[i].mbp_help_msg; opal_list_append(*info, (opal_list_item_t*) p); } } /* All done */ return OPAL_SUCCESS;}/* * Make an argv-style list of strings suitable for an environment */int mca_base_param_build_env(char ***env, int *num_env, bool internal){ size_t i, len; mca_base_param_t *array; char *str; mca_base_param_storage_t storage; /* Check for bozo cases */ if (!initialized) { return OPAL_ERROR; } /* Iterate through all the registered parameters */ len = opal_value_array_get_size(&mca_base_params); array = OPAL_VALUE_ARRAY_GET_BASE(&mca_base_params, mca_base_param_t); for (i = 0; i < len; ++i) { /* Don't output read-only values */ if (array[i].mbp_read_only) { continue; } if (array[i].mbp_internal == internal || internal) { if (param_lookup(i, &storage, NULL)) { if (MCA_BASE_PARAM_TYPE_INT == array[i].mbp_type) { asprintf(&str, "%s=%d", array[i].mbp_env_var_name, storage.intval); opal_argv_append(num_env, env, str); free(str); } else if (MCA_BASE_PARAM_TYPE_STRING == array[i].mbp_type) { if (NULL != storage.stringval) { asprintf(&str, "%s=%s", array[i].mbp_env_var_name, storage.stringval); free(storage.stringval); opal_argv_append(num_env, env, str); free(str); } } else { goto cleanup; } } else { goto cleanup; } } } /* All done */ return OPAL_SUCCESS; /* Error condition */ cleanup: if (*num_env > 0) { opal_argv_free(*env); *num_env = 0; *env = NULL; } return OPAL_ERR_NOT_FOUND;}/* * Free a list -- and all associated memory -- that was previously * returned from mca_base_param_dump() */int mca_base_param_dump_release(opal_list_t *info){ opal_list_item_t *item; for (item = opal_list_remove_first(info); NULL != item; item = opal_list_remove_first(info)) { OBJ_RELEASE(item); } OBJ_RELEASE(info); return OPAL_SUCCESS;}/* * Shut down the MCA parameter system (normally only invoked by the * MCA framework itself). */int mca_base_param_finalize(void){ opal_list_item_t *item; mca_base_param_t *array; if (initialized) { /* This is slow, but effective :-) */ array = OPAL_VALUE_ARRAY_GET_BASE(&mca_base_params, mca_base_param_t); while (opal_value_array_get_size(&mca_base_params) > 0) { OBJ_DESTRUCT(&array[0]); opal_value_array_remove_item(&mca_base_params, 0); } OBJ_DESTRUCT(&mca_base_params); for (item = opal_list_remove_first(&mca_base_param_file_values); NULL != item; item = opal_list_remove_first(&mca_base_param_file_values)) { OBJ_RELEASE(item); } OBJ_DESTRUCT(&mca_base_param_file_values); initialized = false; } /* All done */ return OPAL_SUCCESS;}/*************************************************************************/static int read_files(char *file_list){ int i, count; char **files; /* Iterate through all the files passed in -- read them in reverse order so that we preserve unix/shell path-like semantics (i.e., the entries farthest to the left get precedence) */ files = opal_argv_split(file_list, OPAL_ENV_SEP); count = opal_argv_count(files); for (i = count - 1; i >= 0; --i) { mca_base_parse_paramfile(files[i]); } opal_argv_free(files); return OPAL_SUCCESS;}static int param_register(const char *type_name, const char *component_name, const char *param_name, const char *help_msg, mca_base_param_type_t type, bool internal, bool read_only, mca_base_param_storage_t *default_value, mca_base_param_storage_t *file_value, mca_base_param_storage_t *override_value, mca_base_param_storage_t *current_value){ int ret; size_t i, len; mca_base_param_t param, *array; /* There are data holes in the param struct */ OMPI_DEBUG_ZERO(param); /* Initialize the array if it has never been initialized */ if (!initialized) { mca_base_param_init(); } /* Create a parameter entry. If a keyval is to be used, it will be registered elsewhere. We simply assign -1 here. */ OBJ_CONSTRUCT(¶m, mca_base_param_t); param.mbp_type = type; param.mbp_keyval = -1; param.mbp_internal = internal; param.mbp_read_only = read_only; if (NULL != help_msg) { param.mbp_help_msg = strdup(help_msg); } if (NULL != type_name) { param.mbp_type_name = strdup(type_name); if (NULL == param.mbp_type_name) { OBJ_DESTRUCT(¶m); return OPAL_ERR_OUT_OF_RESOURCE; } } if (NULL != component_name) { param.mbp_component_name = strdup(component_name); if (NULL == param.mbp_component_name) { OBJ_DESTRUCT(¶m); return OPAL_ERR_OUT_OF_RESOURCE; } } param.mbp_param_name = NULL; if (NULL != param_name) { param.mbp_param_name = strdup(param_name); if (NULL == param.mbp_param_name) { OBJ_DESTRUCT(¶m); return OPAL_ERR_OUT_OF_RESOURCE; } } param.mbp_env_var_name = NULL; len = 16; if (NULL != type_name) { len += strlen(type_name); } if (NULL != param.mbp_component_name) { len += strlen(param.mbp_component_name); } if (NULL != param.mbp_param_name) { len += strlen(param.mbp_param_name); } param.mbp_full_name = (char*)malloc(len); if (NULL == param.mbp_full_name) { OBJ_DESTRUCT(¶m); return OPAL_ERROR; } /* Copy the name over in parts */ param.mbp_full_name[0] = '\0'; if (NULL != type_name) { strncat(param.mbp_full_name, type_name, len); } if (NULL != component_name) { if ('\0' != param.mbp_full_name[0]) { strcat(param.mbp_full_name, "_"); } strcat(param.mbp_full_name, component_name); } if (NULL != param_name) { if ('\0' != param.mbp_full_name[0]) { strcat(param.mbp_full_name, "_"); } strcat(param.mbp_full_name, param_name); } /* Create the environment name */ len = strlen(param.mbp_full_name) + strlen(mca_prefix) + 16; param.mbp_env_var_name = (char*)malloc(len); if (NULL == param.mbp_env_var_name) { OBJ_DESTRUCT(¶m); return OPAL_ERROR; } snprintf(param.mbp_env_var_name, len, "%s%s", mca_prefix, param.mbp_full_name); /* Figure out the default value; zero it out if a default is not provided */ if (NULL != default_value) { if (MCA_BASE_PARAM_TYPE_STRING == param.mbp_type && NULL != default_value->stringval) { param.mbp_default_value.stringval = strdup(default_value->stringval); } else { param.mbp_default_value = *default_value; } } else { memset(¶m.mbp_default_value, 0, sizeof(param.mbp_default_value)); } /* Figure out the file value; zero it out if a file is not provided */ if (NULL != file_value) { if (MCA_BASE_PARAM_TYPE_STRING == param.mbp_type && NULL != file_value->stringval) { param.mbp_file_value.stringval = strdup(file_value->stringval); } else { param.mbp_file_value = *file_value; } param.mbp_file_value_set = true; } else { memset(¶m.mbp_file_value, 0, sizeof(param.mbp_file_value)); param.mbp_file_value_set = false; } /* Figure out the override value; zero it out if a override is not provided */ if (NULL != override_value) { if (MCA_BASE_PARAM_TYPE_STRING == param.mbp_type && NULL != override_value->stringval) { param.mbp_override_value.stringval = strdup(override_value->stringval); } else { param.mbp_override_value = *override_value; } param.mbp_override_value_set = true; } else { memset(¶m.mbp_override_value, 0, sizeof(param.mbp_override_value)); param.mbp_override_value_set = false; } /* See if this entry is already in the array */ len = opal_value_array_get_size(&mca_base_params); array = OPAL_VALUE_ARRAY_GET_BASE(&mca_base_params, mca_base_param_t); for (i = 0; i < len; ++i) { if (0 == strcmp(param.mbp_full_name, array[i].mbp_full_name)) { /* We found an entry with the same param name. Check to see if we're changing types */ /* Easy case: both are INT */ if (MCA_BASE_PARAM_TYPE_INT == array[i].mbp_type && MCA_BASE_PARAM_TYPE_INT == param.mbp_type) { if (NULL != default_value) { array[i].mbp_default_value.intval = param.mbp_default_value.intval; } if (NULL != file_value) { array[i].mbp_file_value.intval = param.mbp_file_value.intval; array[i].mbp_file_value_set = true; } if (NULL != override_value) { array[i].mbp_override_value.intval = param.mbp_override_value.intval; array[i].mbp_override_value_set = true; } } /* Both are STRING */ else if (MCA_BASE_PARAM_TYPE_STRING == array[i].mbp_type && MCA_BASE_PARAM_TYPE_STRING == param.mbp_type) { if (NULL != default_value) { if (NULL != array[i].mbp_default_value.stringval) { free(array[i].mbp_default_value.stringval); array[i].mbp_default_value.stringval = NULL; } if (NULL != param.mbp_default_value.stringval) { array[i].mbp_default_value.stringval = strdup(param.mbp_default_value.stringval); } } if (NULL != file_value) { if (NULL != array[i].mbp_file_value.stringval) { free(array[i].mbp_file_value.stringval); array[i].mbp_file_value.stringval = NULL; } if (NULL != param.mbp_file_value.stringval) { array[i].mbp_file_value.stringval = strdup(param.mbp_file_value.stringval); } array[i].mbp_file_value_set = true; } if (NULL != override_value) { if (NULL != array[i].mbp_override_value.stringval) { free(array[i].mbp_override_value.stringval); array[i].mbp_override_value.stringval = NULL; } if (NULL != param.mbp_override_value.stringval) { array[i].mbp_override_value.stringval = strdup(param.mbp_override_value.stringval); } array[i].mbp_override_value_set = true; } } /* Original is INT, new is STRING */ else if (MCA_BASE_PARAM_TYPE_INT == array[i].mbp_type &&
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -