1
1

* fix endian encoding for 64 bit numbers to use hton64

* cleanup the unpack_size_mismatch macros a little bit
* ad comment about endianness of size_mismatch cleanup code so that I don't
  think I've found a bug that really isn't and lose an hour tracking it down
  again...

This commit was SVN r9458.
Этот коммит содержится в:
Brian Barrett 2006-03-29 18:58:02 +00:00
родитель 5271948ec0
Коммит 02c8a51b76
2 изменённых файлов: 24 добавлений и 27 удалений

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

@ -278,9 +278,9 @@ int orte_dss_pack_int64(orte_buffer_t *buffer, void *src,
size_t num_vals, orte_data_type_t type) size_t num_vals, orte_data_type_t type)
{ {
size_t i; size_t i;
uint32_t tmp, *srctmp = (uint32_t*) src; uint64_t tmp, *srctmp = (uint64_t*) src;
char *dst; char *dst;
size_t bytes_packed = num_vals * sizeof(tmp) * 2; size_t bytes_packed = num_vals * sizeof(tmp);
OPAL_OUTPUT( ( orte_dss_verbose, "orte_dss_pack_int64 * %d\n", num_vals ) ); OPAL_OUTPUT( ( orte_dss_verbose, "orte_dss_pack_int64 * %d\n", num_vals ) );
/* check to see if buffer needs extending */ /* check to see if buffer needs extending */
@ -289,11 +289,8 @@ int orte_dss_pack_int64(orte_buffer_t *buffer, void *src,
return ORTE_ERR_OUT_OF_RESOURCE; return ORTE_ERR_OUT_OF_RESOURCE;
} }
for (i = 0; i < 2*num_vals; i += 2) { for (i = 0; i < num_vals; ++i) {
tmp = htonl(srctmp[i]); tmp = hton64(srctmp[i]);
memcpy(dst, &tmp, sizeof(tmp));
dst += sizeof(tmp);
tmp = htonl(srctmp[i+1]);
memcpy(dst, &tmp, sizeof(tmp)); memcpy(dst, &tmp, sizeof(tmp));
dst += sizeof(tmp); dst += sizeof(tmp);
} }

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

@ -31,32 +31,32 @@
#include "orte/dss/dss_internal.h" #include "orte/dss/dss_internal.h"
#define UNPACK_SIZE_MISMATCH(unpack_type) \ #define UNPACK_SIZE_MISMATCH(unpack_type, remote_type, ret) \
do { \ do { \
switch(remote_type) { \ switch(remote_type) { \
case ORTE_UINT8: \ case ORTE_UINT8: \
UNPACK_SIZE_MISMATCH_FOUND(unpack_type, uint8_t, ORTE_UINT8); \ UNPACK_SIZE_MISMATCH_FOUND(unpack_type, uint8_t, remote_type); \
break; \ break; \
case ORTE_INT8: \ case ORTE_INT8: \
UNPACK_SIZE_MISMATCH_FOUND(unpack_type, int8_t, ORTE_INT8); \ UNPACK_SIZE_MISMATCH_FOUND(unpack_type, int8_t, remote_type); \
break; \ break; \
case ORTE_UINT16: \ case ORTE_UINT16: \
UNPACK_SIZE_MISMATCH_FOUND(unpack_type, uint16_t, ORTE_UINT16); \ UNPACK_SIZE_MISMATCH_FOUND(unpack_type, uint16_t, remote_type); \
break; \ break; \
case ORTE_INT16: \ case ORTE_INT16: \
UNPACK_SIZE_MISMATCH_FOUND(unpack_type, int16_t, ORTE_INT16); \ UNPACK_SIZE_MISMATCH_FOUND(unpack_type, int16_t, remote_type); \
break; \ break; \
case ORTE_UINT32: \ case ORTE_UINT32: \
UNPACK_SIZE_MISMATCH_FOUND(unpack_type, uint32_t, ORTE_UINT32); \ UNPACK_SIZE_MISMATCH_FOUND(unpack_type, uint32_t, remote_type); \
break; \ break; \
case ORTE_INT32: \ case ORTE_INT32: \
UNPACK_SIZE_MISMATCH_FOUND(unpack_type, int32_t, ORTE_INT32); \ UNPACK_SIZE_MISMATCH_FOUND(unpack_type, int32_t, remote_type); \
break; \ break; \
case ORTE_UINT64: \ case ORTE_UINT64: \
UNPACK_SIZE_MISMATCH_FOUND(unpack_type, uint64_t, ORTE_UINT64); \ UNPACK_SIZE_MISMATCH_FOUND(unpack_type, uint64_t, remote_type); \
break; \ break; \
case ORTE_INT64: \ case ORTE_INT64: \
UNPACK_SIZE_MISMATCH_FOUND(unpack_type, int64_t, ORTE_INT64); \ UNPACK_SIZE_MISMATCH_FOUND(unpack_type, int64_t, remote_type); \
break; \ break; \
default: \ default: \
ret = ORTE_ERR_NOT_FOUND; \ ret = ORTE_ERR_NOT_FOUND; \
@ -64,6 +64,9 @@
} \ } \
} while (0) } while (0)
/* NOTE: do not need to deal with endianness here, as the unpacking of
the underling sender-side type will do that for us. Repeat: the
data in tmpbuf[] is already in host byte order. */
#define UNPACK_SIZE_MISMATCH_FOUND(unpack_type, tmptype, tmpdsstype) \ #define UNPACK_SIZE_MISMATCH_FOUND(unpack_type, tmptype, tmpdsstype) \
do { \ do { \
size_t i; \ size_t i; \
@ -210,7 +213,7 @@ int orte_dss_unpack_bool(orte_buffer_t *buffer, void *dest,
} }
} else { } else {
/* slow path - types are different sizes */ /* slow path - types are different sizes */
UNPACK_SIZE_MISMATCH(bool); UNPACK_SIZE_MISMATCH(bool, remote_type, ret);
} }
return ret; return ret;
@ -240,7 +243,7 @@ int orte_dss_unpack_int(orte_buffer_t *buffer, void *dest,
} }
} else { } else {
/* slow path - types are different sizes */ /* slow path - types are different sizes */
UNPACK_SIZE_MISMATCH(int); UNPACK_SIZE_MISMATCH(int, remote_type, ret);
} }
return ret; return ret;
@ -270,7 +273,7 @@ int orte_dss_unpack_sizet(orte_buffer_t *buffer, void *dest,
} }
} else { } else {
/* slow path - types are different sizes */ /* slow path - types are different sizes */
UNPACK_SIZE_MISMATCH(size_t); UNPACK_SIZE_MISMATCH(size_t, remote_type, ret);
} }
return ret; return ret;
@ -300,7 +303,7 @@ int orte_dss_unpack_pid(orte_buffer_t *buffer, void *dest,
} }
} else { } else {
/* slow path - types are different sizes */ /* slow path - types are different sizes */
UNPACK_SIZE_MISMATCH(pid_t); UNPACK_SIZE_MISMATCH(pid_t, remote_type, ret);
} }
return ret; return ret;
@ -403,22 +406,19 @@ int orte_dss_unpack_int64(orte_buffer_t *buffer, void *dest,
size_t *num_vals, orte_data_type_t type) size_t *num_vals, orte_data_type_t type)
{ {
size_t i; size_t i;
uint32_t tmp, *desttmp = (uint32_t*) dest; uint64_t tmp, *desttmp = (uint64_t*) dest;
OPAL_OUTPUT( ( orte_dss_verbose, "orte_dss_unpack_int64 * %d\n", (int)*num_vals ) ); OPAL_OUTPUT( ( orte_dss_verbose, "orte_dss_unpack_int64 * %d\n", (int)*num_vals ) );
/* check to see if there's enough data in buffer */ /* check to see if there's enough data in buffer */
if (orte_dss_too_small(buffer, 2*(*num_vals)*sizeof(tmp))) { if (orte_dss_too_small(buffer, (*num_vals)*sizeof(tmp))) {
ORTE_ERROR_LOG(ORTE_ERR_UNPACK_READ_PAST_END_OF_BUFFER); ORTE_ERROR_LOG(ORTE_ERR_UNPACK_READ_PAST_END_OF_BUFFER);
return ORTE_ERR_UNPACK_READ_PAST_END_OF_BUFFER; return ORTE_ERR_UNPACK_READ_PAST_END_OF_BUFFER;
} }
/* unpack the data */ /* unpack the data */
for (i = 0; i < (2 * (*num_vals)); i += 2) { for (i = 0; i < (*num_vals); ++i) {
memcpy( &(tmp), buffer->unpack_ptr, sizeof(tmp) ); memcpy( &(tmp), buffer->unpack_ptr, sizeof(tmp) );
desttmp[i] = ntohl(tmp); desttmp[i] = ntoh64(tmp);
buffer->unpack_ptr += sizeof(tmp);
memcpy( &(tmp), buffer->unpack_ptr, sizeof(tmp) );
desttmp[i+1] = ntohl(tmp);
buffer->unpack_ptr += sizeof(tmp); buffer->unpack_ptr += sizeof(tmp);
} }