int mca_oob_ud_msg_post_send (mca_oob_ud_msg_t *msg) { int rc = ORTE_SUCCESS; msg->status = MCA_OOB_UD_MSG_STATUS_POSTED; OPAL_THREAD_LOCK(&msg->peer->peer_lock); if (MCA_OOB_UD_MSG_ACK == msg->hdr->msg_type || MCA_OOB_UD_MSG_NACK == msg->hdr->msg_type) { rc = mca_oob_ud_qp_post_send (msg->qp, &msg->wr, 1); } else { rc = mca_oob_ud_peer_post_msg (msg->peer, msg); } if (ORTE_SUCCESS != rc && false == msg->persist) { msg->status = MCA_OOB_UD_MSG_STATUS_ERROR; mca_oob_ud_msg_return (msg); } opal_output_verbose(10, orte_oob_base_framework.framework_output, "%s oob:ud:msg_post_send posted send for msg %p with id %" PRIu64, ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (void *) msg, msg->hdr->msg_id); OPAL_THREAD_UNLOCK(&msg->peer->peer_lock); return rc; }
void mca_oob_ud_peer_handle_end (mca_oob_ud_peer_t *peer) { mca_oob_ud_port_t *port = NULL; mca_oob_ud_msg_t *msg = NULL; int rc; OPAL_OUTPUT_VERBOSE((5, mca_oob_base_output, "%s oob:ud:peer_handle_end telling peer %s i " "am going away", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&peer->peer_name))); do { /* tell the peer that we are deleting them */ if (NULL == peer || NULL == peer->peer_context || false == peer->peer_available || false == peer->needs_notification) { OPAL_OUTPUT_VERBOSE((5, mca_oob_base_output, "%s oob:ud:peer_handle_end don't need to tell %s i " "am going away", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&peer->peer_name))); break; } port = (mca_oob_ud_port_t *) opal_list_get_first (&((mca_oob_ud_device_t *)peer->peer_context)->ports); if (NULL == port) { OPAL_OUTPUT_VERBOSE((5, mca_oob_base_output, "%s oob:ud:peer_handle_end can't tell %s i " "am going away (no port)", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&peer->peer_name))); break; } rc = mca_oob_ud_msg_get (port, NULL, &port->listen_qp, peer, true, &msg); if (ORTE_SUCCESS != rc) { OPAL_OUTPUT_VERBOSE((5, mca_oob_base_output, "%s oob:ud:peer_handle_end can't tell %s i " "am going away (no message buffer)", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&peer->peer_name))); break; } peer->peer_timer.tries = 2; peer->peer_timer.value.tv_usec = 500000; msg->hdr->msg_type = MCA_OOB_UD_MSG_END; rc = mca_oob_ud_qp_post_send (&port->listen_qp, &msg->wr, 1); if (ORTE_SUCCESS != rc) { OPAL_OUTPUT_VERBOSE((5, mca_oob_base_output, "%s oob:ud:peer_handle_end can't tell %s i " "am going away (send failed)", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&peer->peer_name))); break; } } while (0); if (NULL != msg) { mca_oob_ud_msg_return (msg); } }
int mca_oob_ud_msg_status_update (mca_oob_ud_msg_t *msg, mca_oob_ud_status_t status) { int rc; opal_output_verbose(10, orte_oob_base_framework.framework_output, "%s oob:ud:msg_status_update setting status of msg %p to %d", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (void *) msg, (int) status); OPAL_THREAD_LOCK(&msg->lock); if (status != msg->status) { if (MCA_OOB_UD_MSG_STATUS_COMPLETE == status) { opal_output_verbose(10, orte_oob_base_framework.framework_output, "%s oob:ud:msg_status_update setting peer %s as available", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&msg->peer->peer_name)); msg->peer->peer_available = true; } switch (status) { case MCA_OOB_UD_MSG_STATUS_TIMEOUT: rc = ORTE_ERR_TIMEOUT; break; case MCA_OOB_UD_MSG_STATUS_COMPLETE: rc = ORTE_SUCCESS; break; case MCA_OOB_UD_MSG_STATUS_ERROR: default: rc = ORTE_ERROR; } if (msg->cbfunc) { msg->cbfunc (msg, rc); } /* signal status change */ msg->status = status; opal_condition_signal (&msg->status_changed); OPAL_THREAD_UNLOCK(&msg->lock); if (false == msg->persist) { mca_oob_ud_msg_return (msg); } return ORTE_SUCCESS; } OPAL_THREAD_UNLOCK(&msg->lock); return ORTE_SUCCESS; }