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.
Этот коммит содержится в:
родитель
41f97931e9
Коммит
ebbb32120a
@ -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,
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user