diff --git a/src/mca/pml/base/pml_base_recvreq.h b/src/mca/pml/base/pml_base_recvreq.h index 484490b766..c6b6b94e7f 100644 --- a/src/mca/pml/base/pml_base_recvreq.h +++ b/src/mca/pml/base/pml_base_recvreq.h @@ -58,6 +58,7 @@ typedef struct mca_pml_base_recv_request_t mca_pml_base_recv_request_t; { \ /* increment reference count on communicator */ \ OBJ_RETAIN(comm); \ + OBJ_RETAIN(datatype); \ \ OMPI_REQUEST_INIT(&(request)->req_base.req_ompi); \ (request)->req_bytes_packed = 0; \ @@ -74,6 +75,18 @@ typedef struct mca_pml_base_recv_request_t mca_pml_base_recv_request_t; (request)->req_base.req_free_called = false; \ } +/** + * Return a receive request. Handle the release of the communicator and the + * attached datatype. + * + * @param request (IN) Receive request. + */ +#define MCA_PML_BASE_RECV_REQUEST_RETURN( request ) \ + do { \ + OBJ_RELEASE( (request)->req_base.req_comm); \ + OBJ_RELEASE( (request)->req_base.req_datatype ); \ + } while (0) + #if defined(c_plusplus) || defined(__cplusplus) } #endif diff --git a/src/mca/pml/base/pml_base_sendreq.h b/src/mca/pml/base/pml_base_sendreq.h index 5adf40e7e2..b9add05ff6 100644 --- a/src/mca/pml/base/pml_base_sendreq.h +++ b/src/mca/pml/base/pml_base_sendreq.h @@ -65,7 +65,7 @@ typedef struct mca_pml_base_send_request_t mca_pml_base_send_request_t; * @param mode (IN) Send mode (STANDARD,BUFFERED,SYNCHRONOUS,READY) * @param persistent (IN) Is request persistent. * - * Performa any one-time initialization. Note that per-use initialization + * Perform a any one-time initialization. Note that per-use initialization * is done in the send request start routine. */ @@ -81,6 +81,7 @@ typedef struct mca_pml_base_send_request_t mca_pml_base_send_request_t; { \ /* increment reference count on communicator */ \ OBJ_RETAIN(comm); \ + OBJ_RETAIN(datatype); \ \ OMPI_REQUEST_INIT(&(request)->req_base.req_ompi); \ request->req_addr = addr; \ @@ -120,6 +121,17 @@ typedef struct mca_pml_base_send_request_t mca_pml_base_send_request_t; } \ } +/** + * Release the ref counts on the communicator and datatype. + * + * @param request (IN) The send request. + */ + +#define MCA_PML_BASE_SEND_REQUEST_RETURN( request ) \ + do { \ + OBJ_RELEASE(request->req_base.req_comm); \ + OBJ_RELEASE(request->req_base.req_datatype); \ + } while (0) /** * Test to check if an acknowledgment has been received, with the match. diff --git a/src/mca/pml/teg/src/pml_teg_recvreq.h b/src/mca/pml/teg/src/pml_teg_recvreq.h index e53cc43012..2c7b8f25fb 100644 --- a/src/mca/pml/teg/src/pml_teg_recvreq.h +++ b/src/mca/pml/teg/src/pml_teg_recvreq.h @@ -36,23 +36,23 @@ OBJ_CLASS_DECLARATION(mca_pml_teg_recv_request_t); * @param rc (OUT) OMPI_SUCCESS or error status on failure. * @return Receive request. */ -#define MCA_PML_TEG_RECV_REQUEST_ALLOC(recvreq, rc) \ - { \ - ompi_list_item_t* item; \ - OMPI_FREE_LIST_GET(&mca_pml_teg.teg_recv_requests, item, rc); \ - recvreq = (mca_pml_base_recv_request_t*)item; \ - } +#define MCA_PML_TEG_RECV_REQUEST_ALLOC(recvreq, rc) \ + do { \ + ompi_list_item_t* item; \ + OMPI_FREE_LIST_GET(&mca_pml_teg.teg_recv_requests, item, rc); \ + recvreq = (mca_pml_base_recv_request_t*)item; \ + } while(0) /** * Return a recv request to the modules free list. * * @param request (IN) Receive request. */ -#define MCA_PML_TEG_RECV_REQUEST_RETURN(request) \ - { \ - OBJ_RELEASE((request)->req_base.req_comm); \ - OMPI_FREE_LIST_RETURN(&mca_pml_teg.teg_recv_requests, (ompi_list_item_t*)request); \ - } +#define MCA_PML_TEG_RECV_REQUEST_RETURN(request) \ + do { \ + MCA_PML_BASE_RECV_REQUEST_RETURN( request ); \ + OMPI_FREE_LIST_RETURN(&mca_pml_teg.teg_recv_requests, (ompi_list_item_t*)request); \ + } while(0) /** * Attempt to match the request against the unexpected fragment list diff --git a/src/mca/pml/teg/src/pml_teg_sendreq.h b/src/mca/pml/teg/src/pml_teg_sendreq.h index 63f95740f1..a3b25c04ff 100644 --- a/src/mca/pml/teg/src/pml_teg_sendreq.h +++ b/src/mca/pml/teg/src/pml_teg_sendreq.h @@ -98,8 +98,8 @@ OBJ_CLASS_DECLARATION(mca_pml_teg_send_request_t); mca_ptl_base_module_t* ptl = (sendreq)->req_ptl; \ mca_pml_base_ptl_t* ptl_base = ptl->ptl_base; \ \ - /* Decrement reference count on communicator. */ \ - OBJ_RELEASE((sendreq)->req_base.req_comm); \ + /* Let the base handle the reference counts */ \ + MCA_PML_BASE_SEND_REQUEST_RETURN(sendreq); \ \ /* \ * If there is a cache associated with the ptl - first attempt \