1
1

MCA/base: variable system updates

- Use an enumerator to handle bool values.

 - Fix a leak in the variable enumerator.

 - Fix a leak in an orte parameter.

This commit was SVN r28949.
Этот коммит содержится в:
Nathan Hjelm 2013-07-25 15:42:01 +00:00
родитель 41f97931e9
Коммит ebbb32120a
4 изменённых файлов: 88 добавлений и 18 удалений

Просмотреть файл

@ -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]);

Просмотреть файл

@ -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);
}
}

Просмотреть файл

@ -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
*

Просмотреть файл

@ -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,