1
1

Fix heterogeneous issue with non-blocking RML receive, where the sender

field could be in the wrong endianness

This commit was SVN r15989.
Этот коммит содержится в:
Brian Barrett 2007-08-28 20:54:52 +00:00
родитель fa69c5cc10
Коммит dcf678dbab
3 изменённых файлов: 23 добавлений и 0 удалений

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

@ -55,6 +55,21 @@ struct orte_rml_oob_msg_header_t {
}; };
typedef struct orte_rml_oob_msg_header_t orte_rml_oob_msg_header_t; typedef struct orte_rml_oob_msg_header_t orte_rml_oob_msg_header_t;
#define ORTE_RML_OOB_MSG_HEADER_HTON(hdr) \
do { \
ORTE_PROCESS_NAME_HTON((hdr).origin); \
ORTE_PROCESS_NAME_HTON((hdr).destination); \
(hdr).tag = htonl((hdr).tag); \
} while (0)
#define ORTE_RML_OOB_MSG_HEADER_NTOH(hdr) \
do { \
ORTE_PROCESS_NAME_NTOH((hdr).origin); \
ORTE_PROCESS_NAME_NTOH((hdr).destination); \
(hdr).tag = ntohl((hdr).tag); \
} while (0)
struct orte_rml_oob_msg_t { struct orte_rml_oob_msg_t {
opal_object_t super; opal_object_t super;

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

@ -38,6 +38,7 @@ orte_rml_recv_msg_callback(int status,
status -= sizeof(orte_rml_oob_msg_header_t); status -= sizeof(orte_rml_oob_msg_header_t);
} }
ORTE_RML_OOB_MSG_HEADER_NTOH(*hdr);
msg->msg_cbfunc.iov(status, &hdr->origin, iov + 1, count - 1, msg->msg_cbfunc.iov(status, &hdr->origin, iov + 1, count - 1,
hdr->tag, msg->msg_cbdata); hdr->tag, msg->msg_cbdata);
if (!msg->msg_persistent) OBJ_RELEASE(msg); if (!msg->msg_persistent) OBJ_RELEASE(msg);
@ -47,6 +48,8 @@ orte_rml_recv_msg_callback(int status,
status = orte_dss.load(&msg->msg_recv_buffer, status = orte_dss.load(&msg->msg_recv_buffer,
iov[1].iov_base, iov[1].iov_base,
iov[1].iov_len); iov[1].iov_len);
ORTE_RML_OOB_MSG_HEADER_NTOH(*hdr);
msg->msg_cbfunc.buffer(status, &hdr->origin, &msg->msg_recv_buffer, msg->msg_cbfunc.buffer(status, &hdr->origin, &msg->msg_recv_buffer,
hdr->tag, msg->msg_cbdata); hdr->tag, msg->msg_cbdata);

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

@ -43,6 +43,7 @@ orte_rml_send_msg_callback(int status,
if (status > 0) { if (status > 0) {
status -= sizeof(orte_rml_oob_msg_header_t); status -= sizeof(orte_rml_oob_msg_header_t);
} }
ORTE_RML_OOB_MSG_HEADER_NTOH(*hdr);
msg->msg_cbfunc.iov(status, peer, iov + 1, count - 1, msg->msg_cbfunc.iov(status, peer, iov + 1, count - 1,
hdr->tag, msg->msg_cbdata); hdr->tag, msg->msg_cbdata);
OBJ_RELEASE(msg); OBJ_RELEASE(msg);
@ -51,6 +52,7 @@ orte_rml_send_msg_callback(int status,
if (status > 0) { if (status > 0) {
status -= sizeof(orte_rml_oob_msg_header_t); status -= sizeof(orte_rml_oob_msg_header_t);
} }
ORTE_RML_OOB_MSG_HEADER_NTOH(*hdr);
msg->msg_cbfunc.buffer(status, peer, msg->user_buffer, msg->msg_cbfunc.buffer(status, peer, msg->user_buffer,
hdr->tag, msg->msg_cbdata); hdr->tag, msg->msg_cbdata);
OBJ_RELEASE(msg->user_buffer); OBJ_RELEASE(msg->user_buffer);
@ -96,6 +98,7 @@ orte_rml_oob_send(orte_process_name_t* peer,
msg->msg_header.origin = *ORTE_PROC_MY_NAME; msg->msg_header.origin = *ORTE_PROC_MY_NAME;
msg->msg_header.destination = *peer; msg->msg_header.destination = *peer;
msg->msg_header.tag = tag; msg->msg_header.tag = tag;
ORTE_RML_OOB_MSG_HEADER_HTON(msg->msg_header);
if (0 == orte_ns.compare_fields(ORTE_NS_CMP_ALL, &next, peer)) { if (0 == orte_ns.compare_fields(ORTE_NS_CMP_ALL, &next, peer)) {
real_tag = tag; real_tag = tag;
@ -166,6 +169,7 @@ orte_rml_oob_send_nb(orte_process_name_t* peer,
msg->msg_header.origin = *ORTE_PROC_MY_NAME; msg->msg_header.origin = *ORTE_PROC_MY_NAME;
msg->msg_header.destination = *peer; msg->msg_header.destination = *peer;
msg->msg_header.tag = tag; msg->msg_header.tag = tag;
ORTE_RML_OOB_MSG_HEADER_HTON(msg->msg_header);
if (0 == orte_ns.compare_fields(ORTE_NS_CMP_ALL, &next, peer)) { if (0 == orte_ns.compare_fields(ORTE_NS_CMP_ALL, &next, peer)) {
real_tag = tag; real_tag = tag;
@ -258,6 +262,7 @@ orte_rml_oob_send_buffer_nb(orte_process_name_t* peer,
msg->msg_header.origin = *ORTE_PROC_MY_NAME; msg->msg_header.origin = *ORTE_PROC_MY_NAME;
msg->msg_header.destination = *peer; msg->msg_header.destination = *peer;
msg->msg_header.tag = tag; msg->msg_header.tag = tag;
ORTE_RML_OOB_MSG_HEADER_HTON(msg->msg_header);
if (0 == orte_ns.compare_fields(ORTE_NS_CMP_ALL, &next, peer)) { if (0 == orte_ns.compare_fields(ORTE_NS_CMP_ALL, &next, peer)) {
real_tag = tag; real_tag = tag;