Remove a sketchy use of asprintf() passing a union by value.
The original code was passing a union by value, and doing odd things on Solaris/SPARC (where "odd" rhymes with "SIGBUS"). Replace it with an exploded switch/case block for all the enum values. Also use the string literals so that we get compiler checking of the format string vs. the type of the actual arguments. cmr=v1.7.4:revier=hjelmn:subject=Fix MCA base var to not pass union by value This commit was SVN r30276.
Этот коммит содержится в:
родитель
91c4890886
Коммит
e3f818ba87
@ -80,17 +80,6 @@ const char *var_type_names[] = {
|
||||
"double"
|
||||
};
|
||||
|
||||
const char *var_type_formats[] = {
|
||||
"%d",
|
||||
"%u",
|
||||
"%lu",
|
||||
"%llu",
|
||||
"%" PRIsize_t,
|
||||
"%s",
|
||||
"%d",
|
||||
"%lf"
|
||||
};
|
||||
|
||||
const size_t var_type_sizes[] = {
|
||||
sizeof (int),
|
||||
sizeof (unsigned),
|
||||
@ -1688,10 +1677,35 @@ static int var_value_string (mca_base_var_t *var, char **value_string)
|
||||
}
|
||||
|
||||
if (NULL == var->mbv_enumerator) {
|
||||
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]);
|
||||
switch (var->mbv_type) {
|
||||
case MCA_BASE_VAR_TYPE_INT:
|
||||
ret = asprintf (value_string, "%d", value->intval);
|
||||
break;
|
||||
case MCA_BASE_VAR_TYPE_UNSIGNED_INT:
|
||||
ret = asprintf (value_string, "%u", value->uintval);
|
||||
break;
|
||||
case MCA_BASE_VAR_TYPE_UNSIGNED_LONG:
|
||||
ret = asprintf (value_string, "%lu", value->ulval);
|
||||
break;
|
||||
case MCA_BASE_VAR_TYPE_UNSIGNED_LONG_LONG:
|
||||
ret = asprintf (value_string, "%llu", value->ullval);
|
||||
break;
|
||||
case MCA_BASE_VAR_TYPE_SIZE_T:
|
||||
ret = asprintf (value_string, "%" PRIsize_t, value->sizetval);
|
||||
break;
|
||||
case MCA_BASE_VAR_TYPE_STRING:
|
||||
ret = asprintf (value_string, "%s",
|
||||
value->stringval ? value->stringval : "");
|
||||
break;
|
||||
case MCA_BASE_VAR_TYPE_BOOL:
|
||||
ret = asprintf (value_string, "%d", value->boolval);
|
||||
break;
|
||||
case MCA_BASE_VAR_TYPE_DOUBLE:
|
||||
ret = asprintf (value_string, "%lf", value->lfval);
|
||||
break;
|
||||
default:
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
ret = (0 > ret) ? OPAL_ERR_OUT_OF_RESOURCE : OPAL_SUCCESS;
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user