This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "MPICH primary repository". The branch, master has been updated via 29711bc6ffcc28e82c8b90cd9cf5ebae18156d9b (commit) from f46354acff66cb0cf5ccc134399d9f5b1bc46b31 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://git.mpich.org/mpich.git/commitdiff/29711bc6ffcc28e82c8b90cd9cf5ebae18... commit 29711bc6ffcc28e82c8b90cd9cf5ebae18156d9b Author: Pavan Balaji <[email protected]> Date: Wed Jan 29 12:48:41 2014 -0600 Move communicator destruction to after progress checks. During finalize, we were destroying the COMM_WORLD, COMM_SELF and COMM_IWORLD communicator objects, and all other associated resources internally, before waiting for the final progress checks for incoming messages finished. This resulted in the following sequence of cleanup: 1. COMM_WORLD got cleaned up. Internally, there is a check to see if a group object has been allocated for COMM_WORLD. If there is one, it is freed up. 2. We waited for other messages to arrive. We noticed a failure at this time, so we try to create a failed process group. This uses the COMM_WORLD group internally, causing it to be created again, but with a reference count of 2, since the code assumes that the first reference count is always for the original COMM_WORLD. 3. When we try to free the world group, we notice that the reference count is 2, so we decrement the reference count and not actually free the object. Moving the check for incoming messages to happen before the communicator free, fixes this problem. Note that the PG finalization still needs to be the last step since that cleans up all the VCs as well. See #1996 Signed-off-by: Wesley Bland <[email protected]> diff --git a/src/mpid/ch3/src/mpid_finalize.c b/src/mpid/ch3/src/mpid_finalize.c index 1a1ad98..4ff6a17 100644 --- a/src/mpid/ch3/src/mpid_finalize.c +++ b/src/mpid/ch3/src/mpid_finalize.c @@ -93,17 +93,6 @@ int MPID_Finalize(void) * cancel it, in which case an error shouldn't be generated. */ -#ifdef MPID_NEEDS_ICOMM_WORLD - mpi_errno = MPIR_Comm_release_always(MPIR_Process.icomm_world, 0); - if (mpi_errno) MPIU_ERR_POP(mpi_errno); -#endif - - mpi_errno = MPIR_Comm_release_always(MPIR_Process.comm_self, 0); - if (mpi_errno) MPIU_ERR_POP(mpi_errno); - - mpi_errno = MPIR_Comm_release_always(MPIR_Process.comm_world, 0); - if (mpi_errno) MPIU_ERR_POP(mpi_errno); - /* Re-enabling the close step because many tests are failing * without it, particularly under gforker */ #if 1 @@ -123,6 +112,17 @@ int MPID_Finalize(void) mpi_errno = MPIDI_CH3_Finalize(); if (mpi_errno) { MPIU_ERR_POP(mpi_errno); } +#ifdef MPID_NEEDS_ICOMM_WORLD + mpi_errno = MPIR_Comm_release_always(MPIR_Process.icomm_world, 0); + if (mpi_errno) MPIU_ERR_POP(mpi_errno); +#endif + + mpi_errno = MPIR_Comm_release_always(MPIR_Process.comm_self, 0); + if (mpi_errno) MPIU_ERR_POP(mpi_errno); + + mpi_errno = MPIR_Comm_release_always(MPIR_Process.comm_world, 0); + if (mpi_errno) MPIU_ERR_POP(mpi_errno); + /* Tell the process group code that we're done with the process groups. This will notify PMI (with PMI_Finalize) if necessary. It also frees all PG structures, including the PG for COMM_WORLD, whose ----------------------------------------------------------------------- Summary of changes: src/mpid/ch3/src/mpid_finalize.c | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) hooks/post-receive -- MPICH primary repository