20 #ifndef PML_CM_RECVREQ_H
21 #define PML_CM_RECVREQ_H
23 #include "pml_cm_request.h"
55 #define MCA_PML_CM_THIN_RECV_REQUEST_ALLOC(recvreq, rc) \
57 ompi_free_list_item_t*item; \
58 OMPI_FREE_LIST_GET(&mca_pml_base_recv_requests, item, rc); \
59 recvreq = (mca_pml_cm_thin_recv_request_t*) item; \
60 recvreq->req_base.req_pml_type = MCA_PML_CM_REQUEST_RECV_THIN; \
61 recvreq->req_mtl.ompi_req = (ompi_request_t*) recvreq; \
62 recvreq->req_mtl.completion_callback = mca_pml_cm_recv_request_completion; \
65 #define MCA_PML_CM_HVY_RECV_REQUEST_ALLOC(recvreq, rc) \
67 ompi_free_list_item_t*item; \
68 OMPI_FREE_LIST_GET(&mca_pml_base_recv_requests, item, rc); \
69 recvreq = (mca_pml_cm_hvy_recv_request_t*) item; \
70 recvreq->req_base.req_pml_type = MCA_PML_CM_REQUEST_RECV_HEAVY; \
71 recvreq->req_mtl.ompi_req = (ompi_request_t*) recvreq; \
72 recvreq->req_mtl.completion_callback = mca_pml_cm_recv_request_completion; \
87 #define MCA_PML_CM_THIN_RECV_REQUEST_INIT( request, \
95 OMPI_REQUEST_INIT(&(request)->req_base.req_ompi, false); \
96 (request)->req_base.req_ompi.req_mpi_object.comm = comm; \
97 (request)->req_base.req_pml_complete = false; \
98 (request)->req_base.req_free_called = false; \
99 request->req_base.req_comm = comm; \
100 request->req_base.req_datatype = datatype; \
102 OBJ_RETAIN(datatype); \
104 if( MPI_ANY_SOURCE == src ) { \
105 ompi_proc = ompi_proc_local_proc; \
107 ompi_proc = ompi_comm_peer_lookup( comm, src ); \
109 opal_convertor_copy_and_prepare_for_recv( \
110 ompi_proc->proc_convertor, \
111 &(datatype->super), \
115 &(request)->req_base.req_convertor ); \
118 #define MCA_PML_CM_HVY_RECV_REQUEST_INIT( request, \
128 OMPI_REQUEST_INIT(&(request)->req_base.req_ompi, persistent); \
129 (request)->req_base.req_ompi.req_mpi_object.comm = comm; \
130 (request)->req_base.req_pml_complete = OPAL_INT_TO_BOOL(persistent); \
131 (request)->req_base.req_free_called = false; \
132 request->req_base.req_comm = comm; \
133 request->req_base.req_datatype = datatype; \
134 request->req_tag = tag; \
135 request->req_peer = src; \
136 request->req_addr = addr; \
137 request->req_count = count; \
139 OBJ_RETAIN(datatype); \
141 if( MPI_ANY_SOURCE == src ) { \
142 ompi_proc = ompi_proc_local_proc; \
144 ompi_proc = ompi_comm_peer_lookup( comm, src ); \
146 opal_convertor_copy_and_prepare_for_recv( \
147 ompi_proc->proc_convertor, \
148 &(datatype->super), \
152 &(request)->req_base.req_convertor ); \
162 #define MCA_PML_CM_THIN_RECV_REQUEST_START(request, comm, tag, src, ret) \
165 request->req_base.req_pml_complete = false; \
166 request->req_base.req_ompi.req_complete = false; \
167 request->req_base.req_ompi.req_state = OMPI_REQUEST_ACTIVE; \
173 request->req_base.req_ompi.req_status.MPI_TAG = OMPI_ANY_TAG; \
174 request->req_base.req_ompi.req_status.MPI_ERROR = OMPI_SUCCESS; \
175 request->req_base.req_ompi.req_status._cancelled = 0; \
176 ret = OMPI_MTL_CALL(irecv(ompi_mtl, \
180 &recvreq->req_base.req_convertor, \
181 &recvreq->req_mtl)); \
184 #define MCA_PML_CM_THIN_RECV_REQUEST_MATCHED_START(request, message, ret) \
187 request->req_base.req_pml_complete = false; \
188 request->req_base.req_ompi.req_complete = false; \
189 request->req_base.req_ompi.req_state = OMPI_REQUEST_ACTIVE; \
195 request->req_base.req_ompi.req_status.MPI_TAG = OMPI_ANY_TAG; \
196 request->req_base.req_ompi.req_status.MPI_ERROR = OMPI_SUCCESS; \
197 request->req_base.req_ompi.req_status._cancelled = 0; \
198 ret = OMPI_MTL_CALL(imrecv(ompi_mtl, \
199 &recvreq->req_base.req_convertor, \
201 &recvreq->req_mtl)); \
205 #define MCA_PML_CM_HVY_RECV_REQUEST_START(request, ret) \
209 request->req_base.req_pml_complete = false; \
210 request->req_base.req_ompi.req_complete = false; \
211 request->req_base.req_ompi.req_state = OMPI_REQUEST_ACTIVE; \
217 request->req_base.req_ompi.req_status.MPI_TAG = OMPI_ANY_TAG; \
218 request->req_base.req_ompi.req_status.MPI_ERROR = OMPI_SUCCESS; \
219 request->req_base.req_ompi.req_status._cancelled = 0; \
220 ret = OMPI_MTL_CALL(irecv(ompi_mtl, \
221 request->req_base.req_comm, \
224 &recvreq->req_base.req_convertor, \
225 &recvreq->req_mtl)); \
234 #define MCA_PML_CM_THIN_RECV_REQUEST_MPI_COMPLETE( recvreq ) \
236 ompi_request_complete( &(recvreq->req_base.req_ompi), true ); \
245 #define MCA_PML_CM_THIN_RECV_REQUEST_PML_COMPLETE(recvreq) \
247 assert( false == recvreq->req_base.req_pml_complete ); \
249 OPAL_THREAD_LOCK(&ompi_request_lock); \
251 if( true == recvreq->req_base.req_free_called ) { \
252 MCA_PML_CM_THIN_RECV_REQUEST_RETURN( recvreq ); \
254 recvreq->req_base.req_pml_complete = true; \
255 ompi_request_complete( &(recvreq->req_base.req_ompi), true ); \
257 OPAL_THREAD_UNLOCK(&ompi_request_lock); \
268 #define MCA_PML_CM_HVY_RECV_REQUEST_PML_COMPLETE(recvreq) \
270 assert( false == recvreq->req_base.req_pml_complete ); \
272 OPAL_THREAD_LOCK(&ompi_request_lock); \
274 if( true == recvreq->req_base.req_free_called ) { \
275 MCA_PML_CM_HVY_RECV_REQUEST_RETURN( recvreq ); \
278 if(recvreq->req_base.req_ompi.req_persistent) { \
281 opal_convertor_set_position(&recvreq->req_base.req_convertor, &offset); \
283 recvreq->req_base.req_pml_complete = true; \
284 ompi_request_complete( &(recvreq->req_base.req_ompi), true ); \
286 OPAL_THREAD_UNLOCK(&ompi_request_lock); \
293 #define MCA_PML_CM_HVY_RECV_REQUEST_RETURN(recvreq) \
295 OBJ_RELEASE((recvreq)->req_base.req_comm); \
296 OBJ_RELEASE((recvreq)->req_base.req_datatype); \
297 OMPI_REQUEST_FINI(&(recvreq)->req_base.req_ompi); \
298 opal_convertor_cleanup( &((recvreq)->req_base.req_convertor) ); \
299 OMPI_FREE_LIST_RETURN( &mca_pml_base_recv_requests, \
300 (ompi_free_list_item_t*)(recvreq)); \
306 #define MCA_PML_CM_THIN_RECV_REQUEST_RETURN(recvreq) \
308 OBJ_RELEASE((recvreq)->req_base.req_comm); \
309 OBJ_RELEASE((recvreq)->req_base.req_datatype); \
310 OMPI_REQUEST_FINI(&(recvreq)->req_base.req_ompi); \
311 opal_convertor_cleanup( &((recvreq)->req_base.req_convertor) ); \
312 OMPI_FREE_LIST_RETURN( &mca_pml_base_recv_requests, \
313 (ompi_free_list_item_t*)(recvreq)); \
316 extern void mca_pml_cm_recv_request_completion(
struct mca_mtl_request_t *mtl_request);
mca_mtl_request_t req_mtl
the mtl specific memory.
Definition: pml_cm_recvreq.h:43
void * req_buff
pointer to send buffer - may not be application buffer
Definition: pml_cm_recvreq.h:40
size_t req_count
count of user datatype elements
Definition: pml_cm_recvreq.h:37
Definition: pml_cm_recvreq.h:27
Definition: pml_cm_recvreq.h:34
int32_t req_tag
user defined tag
Definition: pml_cm_recvreq.h:39
int32_t req_peer
peer process - rank w/in this communicator
Definition: pml_cm_recvreq.h:38
Matching Transport Layer.
size_t req_bytes_packed
packed size of a message given the datatype and count
Definition: pml_cm_recvreq.h:41
mca_mtl_request_t req_mtl
the mtl specific memory.
Definition: pml_cm_recvreq.h:29
Base type for PML CM P2P requests.
Definition: pml_cm_request.h:41
#define OBJ_CLASS_DECLARATION(NAME)
Declaration for class descriptor.
Definition: opal_object.h:236
void * req_addr
pointer to application buffer
Definition: pml_cm_recvreq.h:36