MPID_Request * MPIDI_Recvq_FDP_or_AEU(MPID_Request *newreq, int source, pami_task_t pami_source, int tag, int context_id, int msg_seqno, int * foundp) #endif { MPID_Request * rreq; int found = FALSE; #ifndef OUT_OF_ORDER_HANDLING rreq = MPIDI_Recvq_FDP(source, tag, context_id); #else rreq = MPIDI_Recvq_FDP(source, pami_source, tag, context_id, msg_seqno); #endif if (rreq != NULL) { found = TRUE; } else { #ifndef OUT_OF_ORDER_HANDLING rreq = MPIDI_Recvq_AEU(newreq, source, tag, context_id); #else rreq = MPIDI_Recvq_AEU(newreq, source, pami_source, tag, context_id, msg_seqno); #endif } *foundp = found; return rreq; }
/* MSGQUEUE lock must be held by caller */ void MPIDI_Callback_process_unexp(MPID_Request *newreq, pami_context_t context, const MPIDI_MsgInfo * msginfo, size_t sndlen, pami_endpoint_t sender, const void * sndbuf, pami_recv_t * recv, unsigned isSync) { MPID_Request *rreq = NULL; /* ---------------------------------------------------- */ /* Fallback position: */ /* + Request was not posted, or */ /* + Request was long & not contiguous. */ /* We must allocate enough space to hold the message. */ /* The temporary buffer will be unpacked later. */ /* ---------------------------------------------------- */ unsigned rank = msginfo->MPIrank; unsigned tag = msginfo->MPItag; unsigned context_id = msginfo->MPIctxt; #ifndef OUT_OF_ORDER_HANDLING rreq = MPIDI_Recvq_AEU(newreq, rank, tag, context_id); #else unsigned msg_seqno = msginfo->MPIseqno; rreq = MPIDI_Recvq_AEU(newreq, rank, PAMIX_Endpoint_query(sender), tag, context_id, msg_seqno); #endif /* ---------------------- */ /* Copy in information. */ /* ---------------------- */ rreq->status.MPI_SOURCE = rank; rreq->status.MPI_TAG = tag; MPIR_STATUS_SET_COUNT(rreq->status, sndlen); MPIDI_Request_setCA (rreq, MPIDI_CA_COMPLETE); MPIDI_Request_cpyPeerRequestH(rreq, msginfo); MPIDI_Request_setSync (rreq, isSync); /* Set the rank of the sender if a sync msg. */ #ifndef OUT_OF_ORDER_HANDLING if (isSync) { #endif MPIDI_Request_setPeerRank_comm(rreq, rank); MPIDI_Request_setPeerRank_pami(rreq, PAMIX_Endpoint_query(sender)); #ifndef OUT_OF_ORDER_HANDLING } #endif MPID_assert(!sndlen || rreq->mpid.uebuf != NULL); TRACE_MEMSET_R(PAMIX_Endpoint_query(sender),msg_seqno,recv_status); TRACE_SET_R_VAL(PAMIX_Endpoint_query(sender),(msginfo->MPIseqno & SEQMASK),msgid,msginfo->MPIseqno); TRACE_SET_R_VAL(PAMIX_Endpoint_query(sender),(msginfo->MPIseqno & SEQMASK),rtag,tag); TRACE_SET_R_VAL(PAMIX_Endpoint_query(sender),(msginfo->MPIseqno & SEQMASK),rctx,msginfo->MPIctxt); TRACE_SET_R_VAL(PAMIX_Endpoint_query(sender),(msginfo->MPIseqno & SEQMASK),rlen,sndlen); TRACE_SET_R_VAL(PAMIX_Endpoint_query(sender),(msginfo->MPIseqno & SEQMASK),fl.f.sync,isSync); TRACE_SET_R_VAL(PAMIX_Endpoint_query(sender),(msginfo->MPIseqno & SEQMASK),rsource,PAMIX_Endpoint_query(sender)); TRACE_SET_REQ_VAL(rreq->mpid.idx,(msginfo->MPIseqno & SEQMASK)); if (recv != NULL) { recv->local_fn = MPIDI_RecvDoneCB_mutexed; recv->cookie = rreq; /* -------------------------------------------------- */ /* Let PAMI know where to put the rest of the data. */ /* -------------------------------------------------- */ recv->addr = rreq->mpid.uebuf; } else { /* ------------------------------------------------- */ /* We have the data; copy it and complete the msg. */ /* ------------------------------------------------- */ memcpy(rreq->mpid.uebuf, sndbuf, sndlen); MPIDI_RecvDoneCB(context, rreq, PAMI_SUCCESS); /* caller must release rreq, after unlocking MSGQUEUE */ } }