-: 0:Source:/home/MPI/testing/mpich2/mpich2/src/mpid/ch3/channels/sock/src/ch3_isend.c
-: 0:Graph:ch3_isend.gcno
-: 0:Data:ch3_isend.gcda
-: 0:Runs:4381
-: 0:Programs:1376
-: 1:/* -*- Mode: C; c-basic-offset:4 ; -*- */
-: 2:/*
-: 3: * (C) 2001 by Argonne National Laboratory.
-: 4: * See COPYRIGHT in top-level directory.
-: 5: */
-: 6:
-: 7:#include "mpidi_ch3_impl.h"
-: 8:
-: 9:#undef FUNCNAME
-: 10:#define FUNCNAME update_request
-: 11:#undef FCNAME
-: 12:#define FCNAME MPIDI_QUOTE(FUNCNAME)
-: 13:static void update_request(MPID_Request * sreq, void * hdr,
-: 14: MPIDI_msg_sz_t hdr_sz, MPIU_Size_t nb)
2323: 15:{
-: 16: MPIDI_STATE_DECL(MPID_STATE_UPDATE_REQUEST);
-: 17:
-: 18: MPIDI_FUNC_ENTER(MPID_STATE_UPDATE_REQUEST);
2323: 19: MPIU_Assert(hdr_sz == sizeof(MPIDI_CH3_Pkt_t));
2323: 20: sreq->dev.pending_pkt = *(MPIDI_CH3_PktGeneric_t *) hdr;
2323: 21: sreq->dev.iov[0].MPID_IOV_BUF = (MPID_IOV_BUF_CAST)((char *) &sreq->dev.pending_pkt + nb);
2323: 22: sreq->dev.iov[0].MPID_IOV_LEN = hdr_sz - nb;
2323: 23: sreq->dev.iov_count = 1;
|
-: 24: MPIDI_FUNC_EXIT(MPID_STATE_UPDATE_REQUEST);
|
2323: 25:}
-: 26:
-: 27:#undef FUNCNAME
-: 28:#define FUNCNAME MPIDI_CH3_iSend
-: 29:#undef FCNAME
-: 30:#define FCNAME MPIDI_QUOTE(FUNCNAME)
-: 31:int MPIDI_CH3_iSend(MPIDI_VC_t * vc, MPID_Request * sreq, void * hdr,
-: 32: MPIDI_msg_sz_t hdr_sz)
2260684: 33:{
2260684: 34: int mpi_errno = MPI_SUCCESS;
-: 35: int (*reqFn)(MPIDI_VC_t *, MPID_Request *, int *);
2260684: 36: MPIDI_CH3I_VC *vcch = (MPIDI_CH3I_VC *)vc->channel_private;
-: 37: MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_ISEND);
-: 38:
-: 39: MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3_ISEND);
-: 40:
2260684: 41: MPIU_Assert( hdr_sz <= sizeof(MPIDI_CH3_Pkt_t) );
-: 42:
-: 43: /* The sock channel uses a fixed length header, the size of which is the
-: 44: maximum of all possible packet headers */
2260684: 45: hdr_sz = sizeof(MPIDI_CH3_Pkt_t);
-: 46: MPIU_DBG_STMT(CH3_CHANNEL,VERBOSE,
-: 47: MPIDI_DBG_Print_packet((MPIDI_CH3_Pkt_t*)hdr));
-: 48:
2260684: 49: if (vcch->state == MPIDI_CH3I_VC_STATE_CONNECTED) /* MT */
-: 50: {
-: 51: /* Connection already formed. If send queue is empty attempt to send
-: 52: data, queuing any unsent data. */
2258375: 53: if (MPIDI_CH3I_SendQ_empty(vcch)) /* MT */
-: 54: {
-: 55: MPIU_Size_t nb;
-: 56: int rc;
-: 57:
-: 58: MPIU_DBG_MSG(CH3_CHANNEL,VERBOSE,
-: 59: "send queue empty, attempting to write");
-: 60: MPIU_DBG_PKT(vcch->conn,hdr,"isend");
-: 61: /* MT: need some signalling to lock down our right to use the
-: 62: channel, thus insuring that the progress engine does
-: 63: also try to write */
2258361: 64: rc = MPIDU_Sock_write(vcch->sock, hdr, hdr_sz, &nb);
2258361: 65: if (rc == MPI_SUCCESS)
-: 66: {
-: 67: MPIU_DBG_MSG_D(CH3_CHANNEL,VERBOSE,
-: 68: "wrote %ld bytes", (unsigned long) nb);
-: 69:
2258361: 70: if (nb == hdr_sz)
-: 71: {
-: 72: MPIU_DBG_MSG_D(CH3_CHANNEL,VERBOSE,
-: 73: "write complete " MPIDI_MSG_SZ_FMT " bytes, calling OnDataAvail fcn", nb);
2258361: 74: reqFn = sreq->dev.OnDataAvail;
2258361: 75: if (!reqFn) {
2258361: 76: MPIU_Assert(MPIDI_Request_get_type(sreq)!=MPIDI_REQUEST_TYPE_GET_RESP);
2258361: 77: MPIDI_CH3U_Request_complete(sreq);
-: 78: }
-: 79: else {
-: 80: int complete;
|
#####: 81: mpi_errno = reqFn( vc, sreq, &complete );
|
#####: 82: if (mpi_errno) MPIU_ERR_POP(mpi_errno);
|
#####: 83: if (!complete) {
#####: 84: MPIDI_CH3I_SendQ_enqueue_head(vcch, sreq);
-: 85: MPIU_DBG_MSG_FMT(CH3_CHANNEL,VERBOSE,
-: 86: (MPIU_DBG_FDEST,
-: 87: "posting writev, vc=0x%p, sreq=0x%08x", vc, sreq->handle));
#####: 88: vcch->conn->send_active = sreq;
#####: 89: mpi_errno = MPIDU_Sock_post_writev(
-: 90: vcch->conn->sock, sreq->dev.iov,
-: 91: sreq->dev.iov_count, NULL);
|
-: 92: /* --BEGIN ERROR HANDLING-- */
#####: 93: if (mpi_errno != MPI_SUCCESS)
-: 94: {
#####: 95: mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER,
-: 96: "**ch3|sock|postwrite", "ch3|sock|postwrite %p %p %p",
-: 97: sreq, vcch->conn, vc);
-: 98: }
-: 99: /* --END ERROR HANDLING-- */
-: 100: }
-: 101: }
-: 102: }
-: 103: else
-: 104: {
-: 105: MPIU_DBG_MSG_D(CH3_CHANNEL,VERBOSE,
-: 106: "partial write of " MPIDI_MSG_SZ_FMT " bytes, request enqueued at head", nb);
|
#####: 107: update_request(sreq, hdr, hdr_sz, nb);
#####: 108: MPIDI_CH3I_SendQ_enqueue_head(vcch, sreq);
-: 109: MPIU_DBG_MSG_FMT(CH3_CHANNEL,VERBOSE,
-: 110: (MPIU_DBG_FDEST,"posting write, vc=0x%p, sreq=0x%08x", vc, sreq->handle));
#####: 111: vcch->conn->send_active = sreq;
#####: 112: mpi_errno = MPIDU_Sock_post_write(vcch->conn->sock,
-: 113: sreq->dev.iov[0].MPID_IOV_BUF,
-: 114: sreq->dev.iov[0].MPID_IOV_LEN,
-: 115: sreq->dev.iov[0].MPID_IOV_LEN, NULL);
|
-: 116: /* --BEGIN ERROR HANDLING-- */
#####: 117: if (mpi_errno != MPI_SUCCESS)
-: 118: {
#####: 119: mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER,
-: 120: "**ch3|sock|postwrite", "ch3|sock|postwrite %p %p %p",
-: 121: sreq, vcch->conn, vc);
-: 122: }
-: 123: /* --END ERROR HANDLING-- */
-: 124: }
-: 125: }
-: 126: /* --BEGIN ERROR HANDLING-- */
#####: 127: else if (MPIR_ERR_GET_CLASS(rc) == MPIDU_SOCK_ERR_NOMEM)
-: 128: {
-: 129: MPIU_DBG_MSG(CH3_CHANNEL,TYPICAL,
-: 130: "MPIDU_Sock_write failed, out of memory");
#####: 131: sreq->status.MPI_ERROR = MPIR_ERR_MEMALLOCFAILED;
-: 132: }
-: 133: else
-: 134: {
-: 135: MPIU_DBG_MSG_D(CH3_CHANNEL,TYPICAL,
-: 136: "MPIDU_Sock_write failed, rc=%d", rc);
-: 137: /* Connection just failed. Mark the request complete and
-: 138: return an error. */
-: 139: MPIU_DBG_VCCHSTATECHANGE(vc,VC_STATE_FAILED);
-: 140: /* FIXME: Shouldn't the vc->state also change? */
#####: 141: vcch->state = MPIDI_CH3I_VC_STATE_FAILED;
#####: 142: sreq->status.MPI_ERROR = MPIR_Err_create_code( rc,
-: 143: MPIR_ERR_RECOVERABLE, FCNAME, __LINE__,
-: 144: MPI_ERR_INTERN, "**ch3|sock|writefailed",
-: 145: "**ch3|sock|writefailed %d", rc );
-: 146: /* MT -CH3U_Request_complete() performs write barrier */
#####: 147: MPIDI_CH3U_Request_complete(sreq);
-: 148: /* Make sure that the caller sees this error */
#####: 149: mpi_errno = sreq->status.MPI_ERROR;
-: 150: }
-: 151: /* --END ERROR HANDLING-- */
-: 152: }
-: 153: else
-: 154: {
-: 155: MPIU_DBG_MSG(CH3_CHANNEL,VERBOSE,"send queue not empty, enqueuing");
|
14: 156: update_request(sreq, hdr, hdr_sz, 0);
14: 157: MPIDI_CH3I_SendQ_enqueue(vcch, sreq);
-: 158: }
-: 159: }
2309: 160: else if (vcch->state == MPIDI_CH3I_VC_STATE_CONNECTING) /* MT */
-: 161: {
-: 162: /* queuing the data so it can be sent later. */
-: 163: MPIU_DBG_VCUSE(vc,"connecting. enqueuing request");
30: 164: update_request(sreq, hdr, hdr_sz, 0);
30: 165: MPIDI_CH3I_SendQ_enqueue(vcch, sreq);
-: 166: }
2279: 167: else if (vcch->state == MPIDI_CH3I_VC_STATE_UNCONNECTED) /* MT */
-: 168: {
-: 169: /* Form a new connection, queuing the data so it can be sent later. */
-: 170: MPIU_DBG_VCUSE(vc,"unconnected. enqueuing request");
2279: 171: update_request(sreq, hdr, hdr_sz, 0);
2279: 172: MPIDI_CH3I_SendQ_enqueue(vcch, sreq);
2279: 173: mpi_errno = MPIDI_CH3I_VC_post_connect(vc);
2279: 174: if (mpi_errno) {
|
#####: 175: MPIU_ERR_POP(mpi_errno);
-: 176: }
-: 177: }
|
#####: 178: else if (vcch->state != MPIDI_CH3I_VC_STATE_FAILED)
-: 179: {
-: 180: /* Unable to send data at the moment, so queue it for later */
-: 181: MPIU_DBG_VCUSE(vc,"still connecting. Enqueuing request");
#####: 182: update_request(sreq, hdr, hdr_sz, 0);
#####: 183: MPIDI_CH3I_SendQ_enqueue(vcch, sreq);
-: 184: }
|
-: 185: /* --BEGIN ERROR HANDLING-- */
-: 186: else
-: 187: {
-: 188: /* Connection failed. Mark the request complete and return an error. */
-: 189: /* TODO: Create an appropriate error message */
#####: 190: sreq->status.MPI_ERROR = MPI_ERR_INTERN;
-: 191: /* MT - CH3U_Request_complete() performs write barrier */
#####: 192: MPIDI_CH3U_Request_complete(sreq);
-: 193: }
-: 194: /* --END ERROR HANDLING-- */
-: 195:
2260684: 196: fn_fail:
-: 197: MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3_ISEND);
|
2260684: 198: return mpi_errno;
-: 199:}
-: 200:
|