From 874f497b8ae4384f391dee82712e3b43a091a445 Mon Sep 17 00:00:00 2001 From: George Bosilca Date: Fri, 11 Feb 2005 20:32:10 +0000 Subject: [PATCH] Unified reference count framework. For each request (send and receive) we have to manage the ref count on communicators and datatypes. Now the management is done on the PML base and the others PML's just have to use the corresponding macros from the base. This commit was SVN r4406. --- src/mca/pml/base/pml_base_recvreq.h | 13 +++++++++++++ src/mca/pml/base/pml_base_sendreq.h | 14 +++++++++++++- src/mca/pml/teg/src/pml_teg_recvreq.h | 22 +++++++++++----------- src/mca/pml/teg/src/pml_teg_sendreq.h | 4 ++-- 4 files changed, 39 insertions(+), 14 deletions(-) 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 \