diff --git a/opal/mca/base/mca_base_var.c b/opal/mca/base/mca_base_var.c index 7d1ef7cf2b..b7590e96bb 100644 --- a/opal/mca/base/mca_base_var.c +++ b/opal/mca/base/mca_base_var.c @@ -540,11 +540,7 @@ static int int_from_string(const char *src, mca_base_var_enum_t *enumerator, uin value = strtoull (src, &tmp, 0); is_int = tmp[0] == '\0'; - if (0 == strcasecmp (src, "true")) { - value = 1; - } else if (0 == strcasecmp (src, "false")) { - value = 0; - } else if (!is_int && tmp != src) { + if (!is_int && tmp != src) { switch (tmp[0]) { case 'G': case 'g': @@ -701,11 +697,12 @@ int mca_base_var_deregister(int index) var->mbv_storage->stringval) { free (var->mbv_storage->stringval); var->mbv_storage->stringval = NULL; - } else if (NULL != var->mbv_enumerator) { + } else if (MCA_BASE_VAR_TYPE_BOOL != var->mbv_type && NULL != var->mbv_enumerator) { OBJ_RELEASE(var->mbv_enumerator); - var->mbv_enumerator = NULL; } + var->mbv_enumerator = NULL; + var->mbv_storage = NULL; return OPAL_SUCCESS; @@ -1252,11 +1249,13 @@ static int register_variable (const char *project_name, const char *framework_na } } - if (var->mbv_enumerator) { - OBJ_RELEASE (var->mbv_enumerator); - } + if (MCA_BASE_VAR_TYPE_BOOL == var->mbv_type) { + enumerator = &mca_base_var_enum_bool; + } else if (NULL != enumerator) { + if (var->mbv_enumerator) { + OBJ_RELEASE (var->mbv_enumerator); + } - if (NULL != enumerator) { OBJ_RETAIN(enumerator); } @@ -1607,7 +1606,8 @@ static void var_destructor(mca_base_var_t *var) free (var->mbv_storage->stringval); } - if (NULL != var->mbv_enumerator) { + /* don't release the boolean enumerator */ + if (MCA_BASE_VAR_TYPE_BOOL != var->mbv_type && NULL != var->mbv_enumerator) { OBJ_RELEASE(var->mbv_enumerator); } @@ -1674,9 +1674,7 @@ static int var_value_string (mca_base_var_t *var, char **value_string) } if (NULL == var->mbv_enumerator) { - if (MCA_BASE_VAR_TYPE_BOOL == var->mbv_type) { - ret = asprintf (value_string, value->boolval ? "true" : "false"); - } else if (MCA_BASE_VAR_TYPE_STRING == var->mbv_type) { + if (MCA_BASE_VAR_TYPE_STRING == var->mbv_type) { ret = asprintf (value_string, "%s", value->stringval ? value->stringval : ""); } else { ret = asprintf (value_string, var_type_formats[var->mbv_type], value[0]); diff --git a/opal/mca/base/mca_base_var_enum.c b/opal/mca/base/mca_base_var_enum.c index 1ff823c9a8..9f669be31a 100644 --- a/opal/mca/base/mca_base_var_enum.c +++ b/opal/mca/base/mca_base_var_enum.c @@ -30,10 +30,77 @@ static void mca_base_var_enum_constructor (mca_base_var_enum_t *enumerator); static void mca_base_var_enum_destructor (mca_base_var_enum_t *enumerator); -OBJ_CLASS_INSTANCE(mca_base_var_enum_t, opal_object_t, - mca_base_var_enum_constructor, +OBJ_CLASS_INSTANCE(mca_base_var_enum_t, opal_object_t, mca_base_var_enum_constructor, mca_base_var_enum_destructor); +static int mca_base_var_enum_bool_get_count (mca_base_var_enum_t *enumerator, int *count) +{ + *count = 2; + return OPAL_SUCCESS; +} + +static int mca_base_var_enum_bool_get_value (mca_base_var_enum_t *self, int index, + int *value, const char **string_value) +{ + if (1 < index) { + return OPAL_ERR_VALUE_OUT_OF_BOUNDS; + } + + *value = index ? 1 : 0; + *string_value = index ? "true" : "false"; + + return OPAL_SUCCESS; +} + +static int mca_base_var_enum_bool_vfs (mca_base_var_enum_t *self, const char *string_value, + int *value) +{ + char *tmp; + int v; + + v = strtol (string_value, &tmp, 10); + if (*tmp != '\0') { + if (0 == strcmp (string_value, "true") || 0 == strcmp (string_value, "t") || + 0 == strcmp (string_value, "enabled")) { + v = 1; + } else if (0 == strcmp (string_value, "false") || 0 == strcmp (string_value, "f") || + 0 == strcmp (string_value, "disabled")) { + v = 0; + } else { + return OPAL_ERR_VALUE_OUT_OF_BOUNDS; + } + } + + *value = !!v; + + return OPAL_SUCCESS; +} + +static int mca_base_var_enum_bool_sfv (mca_base_var_enum_t *self, const int value, + const char **string_value) +{ + *string_value = value ? "true" : "false"; + + return OPAL_SUCCESS; +} + +static int mca_base_var_enum_bool_dump (mca_base_var_enum_t *self, char **out) +{ + *out = strdup ("0: f|false|disabled, 1: t|true|enabled"); + return *out ? OPAL_SUCCESS : OPAL_ERR_OUT_OF_RESOURCE; +} + +mca_base_var_enum_t mca_base_var_enum_bool = { + .super = OPAL_OBJ_STATIC_INIT(opal_object_t), + .enum_name = "boolean", + .get_count = mca_base_var_enum_bool_get_count, + .get_value = mca_base_var_enum_bool_get_value, + .value_from_string = mca_base_var_enum_bool_vfs, + .string_from_value = mca_base_var_enum_bool_sfv, + .dump = mca_base_var_enum_bool_dump +}; + + int mca_base_var_enum_create (char *name, mca_base_var_enum_value_t *values, mca_base_var_enum_t **enumerator) { mca_base_var_enum_t *new_enum; @@ -186,4 +253,7 @@ static void mca_base_var_enum_constructor (mca_base_var_enum_t *enumerator) static void mca_base_var_enum_destructor (mca_base_var_enum_t *enumerator) { + if (enumerator->enum_name) { + free (enumerator->enum_name); + } } diff --git a/opal/mca/base/mca_base_vari.h b/opal/mca/base/mca_base_vari.h index 41beec5763..5c807ccb97 100644 --- a/opal/mca/base/mca_base_vari.h +++ b/opal/mca/base/mca_base_vari.h @@ -73,6 +73,8 @@ extern const char *var_type_names[]; extern const size_t var_type_sizes[]; extern bool mca_base_var_initialized; +extern mca_base_var_enum_t mca_base_var_enum_bool; + /** * \internal * diff --git a/orte/runtime/orte_mca_params.c b/orte/runtime/orte_mca_params.c index 197e63d20f..035a1cf608 100644 --- a/orte/runtime/orte_mca_params.c +++ b/orte/runtime/orte_mca_params.c @@ -362,7 +362,7 @@ int orte_register_params(void) } /* User-level debugger info string */ - orte_base_user_debugger = strdup ("totalview @mpirun@ -a @mpirun_args@ : ddt -n @np@ -start @executable@ @executable_argv@ @single_app@ : fxp @mpirun@ -a @mpirun_args@"); + orte_base_user_debugger = "totalview @mpirun@ -a @mpirun_args@ : ddt -n @np@ -start @executable@ @executable_argv@ @single_app@ : fxp @mpirun@ -a @mpirun_args@"; (void) mca_base_var_register ("orte", "orte", NULL, "base_user_debugger", "Sequence of user-level debuggers to search for in orterun", MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,