diff --git a/src/mca/pml/uniq/pml_uniq_recvfrag.c b/src/mca/pml/uniq/pml_uniq_recvfrag.c index 339a2900ec..4fdddb38dc 100644 --- a/src/mca/pml/uniq/pml_uniq_recvfrag.c +++ b/src/mca/pml/uniq/pml_uniq_recvfrag.c @@ -77,9 +77,7 @@ bool mca_pml_uniq_recv_frag_match( if (NULL == frag->frag_base.frag_peer) { frag->frag_base.frag_peer = mca_pml_uniq_proc_lookup_remote_peer(request->req_recv.req_base.req_comm,header->hdr_src,ptl); } - - /* notify ptl of match */ - ptl->ptl_matched(ptl, frag); + MCA_PML_UNIQ_RECV_MATCHED( ptl, frag ); }; diff --git a/src/mca/pml/uniq/pml_uniq_recvfrag.h b/src/mca/pml/uniq/pml_uniq_recvfrag.h index d8da4fca18..f4a8f956cd 100644 --- a/src/mca/pml/uniq/pml_uniq_recvfrag.h +++ b/src/mca/pml/uniq/pml_uniq_recvfrag.h @@ -23,6 +23,7 @@ #include "mca/ptl/ptl.h" #include "mca/pml/base/pml_base_recvreq.h" #include "mca/ptl/base/ptl_base_recvfrag.h" +#include "datatype/convertor.h" /** * Called by the PTL to match attempt a match for new fragments. @@ -38,5 +39,24 @@ bool mca_pml_uniq_recv_frag_match( mca_ptl_base_match_header_t* header ); +#define MCA_PML_UNIQ_RECV_MATCHED( ptl, frag ) \ +do { \ + mca_pml_base_recv_request_t* _request = (mca_pml_base_recv_request_t*)(frag)->frag_request; \ + /* Now that we have the sender we can create the convertor. Additionally, we know */ \ + /* that the required convertor should start at the position zero as we just match */ \ + /* the first fragment. */ \ + if( 0 != (_request)->req_bytes_packed ) { \ + (_request)->req_base.req_proc = ompi_comm_peer_lookup( \ + (_request)->req_base.req_comm, \ + frag->frag_base.frag_header.hdr_match.hdr_src); \ + ompi_convertor_copy_and_prepare_for_recv( \ + (_request)->req_base.req_proc->proc_convertor, \ + (_request)->req_base.req_datatype, \ + (_request)->req_base.req_count, \ + (_request)->req_base.req_addr, \ + &((_request)->req_convertor) ); \ + } \ + ptl->ptl_matched( (ptl), (frag) ); /* notify ptl of match */ \ +} while (0) #endif diff --git a/src/mca/pml/uniq/pml_uniq_recvreq.c b/src/mca/pml/uniq/pml_uniq_recvreq.c index 5f6cba0b8f..fad2c2c2c8 100644 --- a/src/mca/pml/uniq/pml_uniq_recvreq.c +++ b/src/mca/pml/uniq/pml_uniq_recvreq.c @@ -21,7 +21,7 @@ #include "mca/ptl/base/ptl_base_comm.h" #include "pml_uniq_recvreq.h" #include "pml_uniq_sendreq.h" - +#include "pml_uniq_recvfrag.h" static mca_ptl_base_recv_frag_t* mca_pml_uniq_recv_request_match_specific_proc( mca_ptl_base_recv_request_t* request, int proc); @@ -153,7 +153,7 @@ void mca_pml_uniq_recv_request_match_specific(mca_ptl_base_recv_request_t* reque OMPI_THREAD_UNLOCK(&pml_comm->c_matching_lock); if( !((MCA_PML_REQUEST_IPROBE == request->req_recv.req_base.req_type) || (MCA_PML_REQUEST_PROBE == request->req_recv.req_base.req_type)) ) { - ptl->ptl_matched(ptl, frag); + MCA_PML_UNIQ_RECV_MATCHED( ptl, frag ); } return; /* match found */ } @@ -207,7 +207,7 @@ void mca_pml_uniq_recv_request_match_wild(mca_ptl_base_recv_request_t* request) OMPI_THREAD_UNLOCK(&pml_comm->c_matching_lock); if( !((MCA_PML_REQUEST_IPROBE == request->req_recv.req_base.req_type) || (MCA_PML_REQUEST_PROBE == request->req_recv.req_base.req_type)) ) { - ptl->ptl_matched(ptl, frag); + MCA_PML_UNIQ_RECV_MATCHED( ptl, frag ); } return; /* match found */ }