1
1

Add support for "double" to the DSS

This commit was SVN r32149.
Этот коммит содержится в:
Ralph Castain 2014-07-07 13:51:58 +00:00
родитель e498e20d46
Коммит b85471ac13
7 изменённых файлов: 123 добавлений и 12 удалений

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

@ -183,6 +183,15 @@ int opal_dss_compare_float(float *value1, float *value2, opal_data_type_t type)
return OPAL_EQUAL; return OPAL_EQUAL;
} }
int opal_dss_compare_double(double *value1, double *value2, opal_data_type_t type)
{
if (*value1 > *value2) return OPAL_VALUE1_GREATER;
if (*value2 > *value1) return OPAL_VALUE2_GREATER;
return OPAL_EQUAL;
}
/* /*
* NON-NUMERIC SYSTEM TYPES * NON-NUMERIC SYSTEM TYPES
*/ */

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

@ -312,6 +312,9 @@ int opal_dss_pack_buffer_contents(opal_buffer_t *buffer, const void *src,
int opal_dss_pack_float(opal_buffer_t *buffer, const void *src, int opal_dss_pack_float(opal_buffer_t *buffer, const void *src,
int32_t num_vals, opal_data_type_t type); int32_t num_vals, opal_data_type_t type);
int opal_dss_pack_double(opal_buffer_t *buffer, const void *src,
int32_t num_vals, opal_data_type_t type);
int opal_dss_pack_timeval(opal_buffer_t *buffer, const void *src, int opal_dss_pack_timeval(opal_buffer_t *buffer, const void *src,
int32_t num_vals, opal_data_type_t type); int32_t num_vals, opal_data_type_t type);
@ -369,6 +372,9 @@ int opal_dss_unpack_buffer_contents(opal_buffer_t *buffer, void *dest,
int opal_dss_unpack_float(opal_buffer_t *buffer, void *dest, int opal_dss_unpack_float(opal_buffer_t *buffer, void *dest,
int32_t *num_vals, opal_data_type_t type); int32_t *num_vals, opal_data_type_t type);
int opal_dss_unpack_double(opal_buffer_t *buffer, void *dest,
int32_t *num_vals, opal_data_type_t type);
int opal_dss_unpack_timeval(opal_buffer_t *buffer, void *dest, int opal_dss_unpack_timeval(opal_buffer_t *buffer, void *dest,
int32_t *num_vals, opal_data_type_t type); int32_t *num_vals, opal_data_type_t type);
@ -445,6 +451,8 @@ int opal_dss_compare_buffer_contents(opal_buffer_t *value1, opal_buffer_t *value
int opal_dss_compare_float(float *value1, float *value2, opal_data_type_t type); int opal_dss_compare_float(float *value1, float *value2, opal_data_type_t type);
int opal_dss_compare_double(double *value1, double *value2, opal_data_type_t type);
int opal_dss_compare_timeval(struct timeval *value1, struct timeval *value2, opal_data_type_t type); int opal_dss_compare_timeval(struct timeval *value1, struct timeval *value2, opal_data_type_t type);
int opal_dss_compare_time(time_t *value1, time_t *value2, opal_data_type_t type); int opal_dss_compare_time(time_t *value1, time_t *value2, opal_data_type_t type);
@ -482,6 +490,7 @@ int opal_dss_print_node_stat(char **output, char *prefix, opal_node_stats_t *src
int opal_dss_print_value(char **output, char *prefix, opal_value_t *src, opal_data_type_t type); int opal_dss_print_value(char **output, char *prefix, opal_value_t *src, opal_data_type_t type);
int opal_dss_print_buffer_contents(char **output, char *prefix, opal_buffer_t *src, opal_data_type_t type); int opal_dss_print_buffer_contents(char **output, char *prefix, opal_buffer_t *src, opal_data_type_t type);
int opal_dss_print_float(char **output, char *prefix, float *src, opal_data_type_t type); int opal_dss_print_float(char **output, char *prefix, float *src, opal_data_type_t type);
int opal_dss_print_double(char **output, char *prefix, double *src, opal_data_type_t type);
int opal_dss_print_timeval(char **output, char *prefix, struct timeval *src, opal_data_type_t type); int opal_dss_print_timeval(char **output, char *prefix, struct timeval *src, opal_data_type_t type);
int opal_dss_print_time(char **output, char *prefix, time_t *src, opal_data_type_t type); int opal_dss_print_time(char **output, char *prefix, time_t *src, opal_data_type_t type);

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

@ -545,6 +545,16 @@ int opal_dss_open(void)
"OPAL_FLOAT", &tmp))) { "OPAL_FLOAT", &tmp))) {
return rc; return rc;
} }
tmp = OPAL_DOUBLE;
if (OPAL_SUCCESS != (rc = opal_dss.register_type(opal_dss_pack_double,
opal_dss_unpack_double,
(opal_dss_copy_fn_t)opal_dss_std_copy,
(opal_dss_compare_fn_t)opal_dss_compare_double,
(opal_dss_print_fn_t)opal_dss_print_double,
OPAL_DSS_UNSTRUCTURED,
"OPAL_DOUBLE", &tmp))) {
return rc;
}
tmp = OPAL_TIMEVAL; tmp = OPAL_TIMEVAL;
if (OPAL_SUCCESS != (rc = opal_dss.register_type(opal_dss_pack_timeval, if (OPAL_SUCCESS != (rc = opal_dss.register_type(opal_dss_pack_timeval,
opal_dss_unpack_timeval, opal_dss_unpack_timeval,

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

@ -348,6 +348,27 @@ int opal_dss_pack_float(opal_buffer_t *buffer, const void *src,
return OPAL_SUCCESS; return OPAL_SUCCESS;
} }
/* DOUBLE */
int opal_dss_pack_double(opal_buffer_t *buffer, const void *src,
int32_t num_vals, opal_data_type_t type)
{
int ret = OPAL_SUCCESS;
int32_t i;
double *ssrc = (double*)src;
char *convert;
for (i = 0; i < num_vals; ++i) {
asprintf(&convert, "%f", ssrc[i]);
if (OPAL_SUCCESS != (ret = opal_dss_pack_string(buffer, &convert, 1, OPAL_STRING))) {
free(convert);
return ret;
}
free(convert);
}
return OPAL_SUCCESS;
}
/* TIMEVAL */ /* TIMEVAL */
int opal_dss_pack_timeval(opal_buffer_t *buffer, const void *src, int opal_dss_pack_timeval(opal_buffer_t *buffer, const void *src,
int32_t num_vals, opal_data_type_t type) int32_t num_vals, opal_data_type_t type)
@ -782,6 +803,11 @@ int opal_dss_pack_value(opal_buffer_t *buffer, const void *src,
return ret; return ret;
} }
break; break;
case OPAL_DOUBLE:
if (OPAL_SUCCESS != (ret = opal_dss_pack_buffer(buffer, &ptr[i]->data.dval, 1, OPAL_DOUBLE))) {
return ret;
}
break;
case OPAL_TIMEVAL: case OPAL_TIMEVAL:
if (OPAL_SUCCESS != (ret = opal_dss_pack_buffer(buffer, &ptr[i]->data.tv, 1, OPAL_TIMEVAL))) { if (OPAL_SUCCESS != (ret = opal_dss_pack_buffer(buffer, &ptr[i]->data.tv, 1, OPAL_TIMEVAL))) {
return ret; return ret;

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

@ -370,6 +370,26 @@ int opal_dss_print_float(char **output, char *prefix,
return OPAL_SUCCESS; return OPAL_SUCCESS;
} }
int opal_dss_print_double(char **output, char *prefix,
double *src, opal_data_type_t type)
{
char *prefx;
/* deal with NULL prefix */
if (NULL == prefix) asprintf(&prefx, " ");
else prefx = prefix;
/* if src is NULL, just print data type and return */
if (NULL == src) {
asprintf(output, "%sData type: OPAL_DOUBLE\tValue: NULL pointer", prefx);
return OPAL_SUCCESS;
}
asprintf(output, "%sData type: OPAL_DOUBLE\tValue: %f", prefx, *src);
return OPAL_SUCCESS;
}
int opal_dss_print_time(char **output, char *prefix, int opal_dss_print_time(char **output, char *prefix,
time_t *src, opal_data_type_t type) time_t *src, opal_data_type_t type)
{ {
@ -611,6 +631,10 @@ int opal_dss_print_value(char **output, char *prefix, opal_value_t *src, opal_da
asprintf(output, "%sOPAL_VALUE: Data type: OPAL_FLOAT\tKey: %s\tValue: %f", asprintf(output, "%sOPAL_VALUE: Data type: OPAL_FLOAT\tKey: %s\tValue: %f",
prefx, src->key, src->data.fval); prefx, src->key, src->data.fval);
break; break;
case OPAL_DOUBLE:
asprintf(output, "%sOPAL_VALUE: Data type: OPAL_DOUBLE\tKey: %s\tValue: %f",
prefx, src->key, src->data.dval);
break;
case OPAL_BYTE_OBJECT: case OPAL_BYTE_OBJECT:
asprintf(output, "%sOPAL_VALUE: Data type: OPAL_BYTE_OBJECT\tKey: %s\tData: %s\tSize: %lu", asprintf(output, "%sOPAL_VALUE: Data type: OPAL_BYTE_OBJECT\tKey: %s\tData: %s\tSize: %lu",
prefx, src->key, (NULL == src->data.bo.bytes) ? "NULL" : "NON-NULL", (unsigned long)src->data.bo.size); prefx, src->key, (NULL == src->data.bo.bytes) ? "NULL" : "NON-NULL", (unsigned long)src->data.bo.size);

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

@ -74,21 +74,22 @@ typedef uint64_t opal_identifier_t;
#define OPAL_UINT16 (opal_data_type_t) 13 /**< a 16-bit unsigned integer */ #define OPAL_UINT16 (opal_data_type_t) 13 /**< a 16-bit unsigned integer */
#define OPAL_UINT32 (opal_data_type_t) 14 /**< a 32-bit unsigned integer */ #define OPAL_UINT32 (opal_data_type_t) 14 /**< a 32-bit unsigned integer */
#define OPAL_UINT64 (opal_data_type_t) 15 /**< a 64-bit unsigned integer */ #define OPAL_UINT64 (opal_data_type_t) 15 /**< a 64-bit unsigned integer */
/* simple floating point type */ /* floating point types */
#define OPAL_FLOAT (opal_data_type_t) 16 #define OPAL_FLOAT (opal_data_type_t) 16
#define OPAL_DOUBLE (opal_data_type_t) 17
/* system types */ /* system types */
#define OPAL_TIMEVAL (opal_data_type_t) 17 #define OPAL_TIMEVAL (opal_data_type_t) 18
#define OPAL_TIME (opal_data_type_t) 18 #define OPAL_TIME (opal_data_type_t) 19
/* OPAL types */ /* OPAL types */
#define OPAL_BYTE_OBJECT (opal_data_type_t) 19 /**< byte object structure */ #define OPAL_BYTE_OBJECT (opal_data_type_t) 20 /**< byte object structure */
#define OPAL_DATA_TYPE (opal_data_type_t) 20 /**< data type */ #define OPAL_DATA_TYPE (opal_data_type_t) 21 /**< data type */
#define OPAL_NULL (opal_data_type_t) 21 /**< don't interpret data type */ #define OPAL_NULL (opal_data_type_t) 22 /**< don't interpret data type */
#define OPAL_PSTAT (opal_data_type_t) 22 /**< process statistics */ #define OPAL_PSTAT (opal_data_type_t) 23 /**< process statistics */
#define OPAL_NODE_STAT (opal_data_type_t) 23 /**< node statistics */ #define OPAL_NODE_STAT (opal_data_type_t) 24 /**< node statistics */
#define OPAL_HWLOC_TOPO (opal_data_type_t) 24 /**< hwloc topology */ #define OPAL_HWLOC_TOPO (opal_data_type_t) 25 /**< hwloc topology */
#define OPAL_VALUE (opal_data_type_t) 25 /**< opal value structure */ #define OPAL_VALUE (opal_data_type_t) 26 /**< opal value structure */
#define OPAL_BUFFER (opal_data_type_t) 26 /**< pack the remaining contents of a buffer as an object */ #define OPAL_BUFFER (opal_data_type_t) 27 /**< pack the remaining contents of a buffer as an object */
#define OPAL_PTR (opal_data_type_t) 27 /**< pointer to void* */ #define OPAL_PTR (opal_data_type_t) 28 /**< pointer to void* */
#define OPAL_DSS_ID_DYNAMIC (opal_data_type_t) 30 #define OPAL_DSS_ID_DYNAMIC (opal_data_type_t) 30
@ -120,6 +121,7 @@ typedef struct {
uint64_t uint64; uint64_t uint64;
opal_byte_object_t bo; opal_byte_object_t bo;
float fval; float fval;
double dval;
struct timeval tv; struct timeval tv;
void *ptr; // never packed or passed anywhere void *ptr; // never packed or passed anywhere
} data; } data;

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

@ -425,6 +425,32 @@ int opal_dss_unpack_float(opal_buffer_t *buffer, void *dest,
return OPAL_SUCCESS; return OPAL_SUCCESS;
} }
int opal_dss_unpack_double(opal_buffer_t *buffer, void *dest,
int32_t *num_vals, opal_data_type_t type)
{
int32_t i, n;
double *desttmp = (double*) dest;
int ret;
char *convert;
OPAL_OUTPUT( ( opal_dss_verbose, "opal_dss_unpack_double * %d\n", (int)*num_vals ) );
/* check to see if there's enough data in buffer */
if (opal_dss_too_small(buffer, (*num_vals)*sizeof(double))) {
return OPAL_ERR_UNPACK_READ_PAST_END_OF_BUFFER;
}
/* unpack the data */
for (i = 0; i < (*num_vals); ++i) {
n=1;
if (OPAL_SUCCESS != (ret = opal_dss_unpack_string(buffer, &convert, &n, OPAL_STRING))) {
return ret;
}
desttmp[i] = strtod(convert, NULL);
free(convert);
}
return OPAL_SUCCESS;
}
int opal_dss_unpack_timeval(opal_buffer_t *buffer, void *dest, int opal_dss_unpack_timeval(opal_buffer_t *buffer, void *dest,
int32_t *num_vals, opal_data_type_t type) int32_t *num_vals, opal_data_type_t type)
{ {
@ -1024,6 +1050,11 @@ int opal_dss_unpack_value(opal_buffer_t *buffer, void *dest,
return ret; return ret;
} }
break; break;
case OPAL_DOUBLE:
if (OPAL_SUCCESS != (ret = opal_dss_unpack_buffer(buffer, &ptr[i]->data.dval, &m, OPAL_DOUBLE))) {
return ret;
}
break;
case OPAL_TIMEVAL: case OPAL_TIMEVAL:
if (OPAL_SUCCESS != (ret = opal_dss_unpack_buffer(buffer, &ptr[i]->data.tv, &m, OPAL_TIMEVAL))) { if (OPAL_SUCCESS != (ret = opal_dss_unpack_buffer(buffer, &ptr[i]->data.tv, &m, OPAL_TIMEVAL))) {
return ret; return ret;