static int mca_oob_ud_event_handle_rep (mca_oob_ud_port_t *port, mca_oob_ud_msg_hdr_t *msg_hdr)
{
    mca_oob_ud_req_t *send_req = (mca_oob_ud_req_t *) msg_hdr->msg_lcl_ctx;
    bool brc;

    OPAL_OUTPUT_VERBOSE((10, mca_oob_base_output, "%s oob:ud:event_handle_rep got reply for request %p",
                         ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (void *) send_req));

    brc = mca_oob_ud_req_is_in_list (send_req, &mca_oob_ud_component.ud_active_sends);
    if (false == brc) {
        OPAL_OUTPUT_VERBOSE((0, mca_oob_base_output, "%s oob:ud:event_handle_rep no send matches reply",
                             ORTE_NAME_PRINT(ORTE_PROC_MY_NAME)));
        /* duplicate reply message? */
        return ORTE_SUCCESS;
    }

    send_req->req_mtu          = min(send_req->req_mtu, msg_hdr->msg_data.rep.mtu);
    send_req->req_rem_data_len = msg_hdr->msg_data.rep.data_len;
    send_req->req_rem_ctx      = msg_hdr->msg_rem_ctx;
    send_req->req_rem_qpn      = msg_hdr->msg_data.rep.qpn;

    mca_oob_ud_event_queue_completed (send_req);

    return ORTE_SUCCESS;
}
static int mca_oob_ud_event_handle_data_ok (mca_oob_ud_port_t *port, mca_oob_ud_msg_hdr_t *msg_hdr)
{
    mca_oob_ud_req_t *send_req = msg_hdr->msg_lcl_ctx;
    bool brc;

    if (NULL == send_req) {
        /* ack! */
        return ORTE_ERROR;
    }

    OPAL_OUTPUT_VERBOSE((10, mca_oob_base_output, "%s oob:ud:event_handle_data_ok got data ok message for "
                         "request %p", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (void *) send_req));

    brc = mca_oob_ud_req_is_in_list (send_req, &mca_oob_ud_component.ud_active_sends);
    if (false == brc) {
        OPAL_OUTPUT_VERBOSE((0, mca_oob_base_output, "%s oob:ud:event_handle_data_ok apparent duplicate data ok. "
                             "request %p. req list = %p", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (void *) send_req,
                             (void *) send_req->req_list));
        /* duplicate data ok message? */
        return ORTE_SUCCESS;
    }

    send_req->state = MCA_OOB_UD_REQ_COMPLETE;
    mca_oob_ud_event_queue_completed (send_req);

    return ORTE_SUCCESS;
}
static int mca_oob_ud_event_handle_completion (mca_oob_ud_port_t *port, mca_oob_ud_msg_hdr_t *msg_hdr)
{
    mca_oob_ud_req_t *recv_req = msg_hdr->msg_lcl_ctx;
    bool brc;

    if (NULL == recv_req) {
        return ORTE_ERROR;
    }

    OPAL_OUTPUT_VERBOSE((5, mca_oob_base_output, "%s oob:ud:event_handle_completion got "
                         "completion message for request %p", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME),
                         (void *) recv_req));

    brc = mca_oob_ud_req_is_in_list (recv_req, &mca_oob_ud_component.ud_active_recvs);
    if (false == brc) {
        /* duplicate completion message? */
        OPAL_OUTPUT_VERBOSE((0, mca_oob_base_output, "%s oob:ud:event_handle_completion apparent duplicate completion. "
                             "request %p. req list = %p", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (void *) recv_req,
                             (void *) recv_req->req_list));
        return ORTE_SUCCESS;
    }

    recv_req->state = MCA_OOB_UD_REQ_COMPLETE;
    mca_oob_ud_event_queue_completed (recv_req);

    return ORTE_SUCCESS;
}
static int mca_oob_ud_event_handle_req (mca_oob_ud_port_t *port, mca_oob_ud_peer_t *peer, mca_oob_ud_msg_hdr_t *msg_hdr)
{
    mca_oob_ud_req_t *recv_req;
    int rc;

    rc = mca_oob_ud_recv_match_send (port, peer, msg_hdr, &recv_req);
    if (ORTE_SUCCESS == rc) {
        mca_oob_ud_event_queue_completed (recv_req);
    }

    return rc;
}
Example #5
0
static int mca_oob_ud_send_self (orte_rml_send_t *msg)
{
    unsigned int srco, dsto;
    mca_oob_ud_req_t *req;
    int srci, dsti;
    int rc, size;

    MCA_OOB_UD_IOV_SIZE(msg, size);

    opal_output_verbose(10, orte_oob_base_framework.framework_output,
                         "%s mca_oob_ud_send_self: sending %d bytes to myself",
                         ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), size);

    rc = mca_oob_ud_get_recv_req (*ORTE_PROC_MY_NAME, msg->tag, &req, (msg->iov != NULL) ? true : false);
    if (ORTE_SUCCESS != rc) {
        return rc;
    }

    req->req_rem_data_len = size;
    req->req_is_eager     = true;

    rc = mca_oob_ud_recv_alloc (req);
    if (ORTE_SUCCESS != rc) {
        ORTE_ERROR_LOG(rc);
        if (MCA_OOB_UD_REQ_IOV == req->req_data_type) {
            free (req->req_data.iov.uiov);
        }
        OBJ_RELEASE(req);
        return rc;
    }

    srci = dsti = 0;
    srco = dsto = 0;

    if (msg->iov != NULL) {
        do {
            req->req_data_type = MCA_OOB_UD_REQ_IOV;
            size_t copy = min(msg->iov[srci].iov_len - srco,
                              req->req_data.iov.uiov[dsti].iov_len - dsto);

            memmove ((unsigned char *) req->req_data.iov.uiov[dsti].iov_base + dsto,
                     (unsigned char *) msg->iov[srci].iov_base + srco, copy);

            srco += copy;
            if (srco == msg->iov[srci].iov_len) {
                srci++;
                srco = 0;
            }

            dsto += copy;
            if (dsto == req->req_data.iov.uiov[dsti].iov_len) {
                dsti++;
                dsto = 0;
            }
        } while (srci < req->req_data.iov.count && dsti < msg->count);
    } else {
        req->req_data_type = MCA_OOB_UD_REQ_BUF;

        opal_buffer_t *buffer;
        buffer = OBJ_NEW(opal_buffer_t);

        if (OPAL_SUCCESS != (rc = opal_dss.copy_payload(buffer, msg->buffer))) {
            ORTE_ERROR_LOG(rc);
            OBJ_RELEASE(buffer);
            return rc;
        }
        if (OPAL_SUCCESS != (rc = opal_dss.unload(buffer, (void **)&req->req_data.buf.p, &req->req_data.buf.size)))
        {
            ORTE_ERROR_LOG(rc);
            OBJ_RELEASE(buffer);
            free(req->req_data.buf.p);
            return rc;
        }
        OBJ_RELEASE(buffer);
    }

    req->state = MCA_OOB_UD_REQ_COMPLETE;

    opal_output_verbose(10, orte_oob_base_framework.framework_output,
                         "%s mca_oob_ud_send_self: complete. calling callbacks",
                         ORTE_NAME_PRINT(ORTE_PROC_MY_NAME));

    /* queue up recv callback */
    mca_oob_ud_event_queue_completed (req);

    req->rml_msg->status = ORTE_SUCCESS;

    ORTE_RML_SEND_COMPLETE(req->rml_msg);

    return size;
}