diff --git a/opal/dss/dss_compare.c b/opal/dss/dss_compare.c index 000b9a3dc6..7e838d6fae 100644 --- a/opal/dss/dss_compare.c +++ b/opal/dss/dss_compare.c @@ -183,6 +183,15 @@ int opal_dss_compare_float(float *value1, float *value2, opal_data_type_t type) 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 */ diff --git a/opal/dss/dss_internal.h b/opal/dss/dss_internal.h index 08d387e09d..5681fffaab 100644 --- a/opal/dss/dss_internal.h +++ b/opal/dss/dss_internal.h @@ -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, 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, 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, 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, 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_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_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_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_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_time(char **output, char *prefix, time_t *src, opal_data_type_t type); diff --git a/opal/dss/dss_open_close.c b/opal/dss/dss_open_close.c index 97592115b0..bbff4fbfd9 100644 --- a/opal/dss/dss_open_close.c +++ b/opal/dss/dss_open_close.c @@ -545,6 +545,16 @@ int opal_dss_open(void) "OPAL_FLOAT", &tmp))) { 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; if (OPAL_SUCCESS != (rc = opal_dss.register_type(opal_dss_pack_timeval, opal_dss_unpack_timeval, diff --git a/opal/dss/dss_pack.c b/opal/dss/dss_pack.c index 83e8c8a9e0..8e7eba515a 100644 --- a/opal/dss/dss_pack.c +++ b/opal/dss/dss_pack.c @@ -348,6 +348,27 @@ int opal_dss_pack_float(opal_buffer_t *buffer, const void *src, 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 */ int opal_dss_pack_timeval(opal_buffer_t *buffer, const void *src, 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; } 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: if (OPAL_SUCCESS != (ret = opal_dss_pack_buffer(buffer, &ptr[i]->data.tv, 1, OPAL_TIMEVAL))) { return ret; diff --git a/opal/dss/dss_print.c b/opal/dss/dss_print.c index d8c6a4ee22..e216057d23 100644 --- a/opal/dss/dss_print.c +++ b/opal/dss/dss_print.c @@ -370,6 +370,26 @@ int opal_dss_print_float(char **output, char *prefix, 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, 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", prefx, src->key, src->data.fval); 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: 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); diff --git a/opal/dss/dss_types.h b/opal/dss/dss_types.h index e165031882..511bea3246 100644 --- a/opal/dss/dss_types.h +++ b/opal/dss/dss_types.h @@ -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_UINT32 (opal_data_type_t) 14 /**< a 32-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_DOUBLE (opal_data_type_t) 17 /* system types */ -#define OPAL_TIMEVAL (opal_data_type_t) 17 -#define OPAL_TIME (opal_data_type_t) 18 +#define OPAL_TIMEVAL (opal_data_type_t) 18 +#define OPAL_TIME (opal_data_type_t) 19 /* OPAL types */ -#define OPAL_BYTE_OBJECT (opal_data_type_t) 19 /**< byte object structure */ -#define OPAL_DATA_TYPE (opal_data_type_t) 20 /**< data type */ -#define OPAL_NULL (opal_data_type_t) 21 /**< don't interpret data type */ -#define OPAL_PSTAT (opal_data_type_t) 22 /**< process statistics */ -#define OPAL_NODE_STAT (opal_data_type_t) 23 /**< node statistics */ -#define OPAL_HWLOC_TOPO (opal_data_type_t) 24 /**< hwloc topology */ -#define OPAL_VALUE (opal_data_type_t) 25 /**< opal value structure */ -#define OPAL_BUFFER (opal_data_type_t) 26 /**< pack the remaining contents of a buffer as an object */ -#define OPAL_PTR (opal_data_type_t) 27 /**< pointer to void* */ +#define OPAL_BYTE_OBJECT (opal_data_type_t) 20 /**< byte object structure */ +#define OPAL_DATA_TYPE (opal_data_type_t) 21 /**< data type */ +#define OPAL_NULL (opal_data_type_t) 22 /**< don't interpret data type */ +#define OPAL_PSTAT (opal_data_type_t) 23 /**< process statistics */ +#define OPAL_NODE_STAT (opal_data_type_t) 24 /**< node statistics */ +#define OPAL_HWLOC_TOPO (opal_data_type_t) 25 /**< hwloc topology */ +#define OPAL_VALUE (opal_data_type_t) 26 /**< opal value structure */ +#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) 28 /**< pointer to void* */ #define OPAL_DSS_ID_DYNAMIC (opal_data_type_t) 30 @@ -120,6 +121,7 @@ typedef struct { uint64_t uint64; opal_byte_object_t bo; float fval; + double dval; struct timeval tv; void *ptr; // never packed or passed anywhere } data; diff --git a/opal/dss/dss_unpack.c b/opal/dss/dss_unpack.c index 87949c3686..93832fb7d9 100644 --- a/opal/dss/dss_unpack.c +++ b/opal/dss/dss_unpack.c @@ -425,6 +425,32 @@ int opal_dss_unpack_float(opal_buffer_t *buffer, void *dest, 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, 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; } 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: if (OPAL_SUCCESS != (ret = opal_dss_unpack_buffer(buffer, &ptr[i]->data.tv, &m, OPAL_TIMEVAL))) { return ret;