-:    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: