int MPID_Comm_failure_get_acked(MPID_Comm *comm_ptr, MPID_Group **group_ptr) { int mpi_errno = MPI_SUCCESS; MPID_Group *failed_group, *comm_group; MPIDI_STATE_DECL(MPID_STATE_MPID_COMM_FAILURE_GET_ACKED); MPIDI_FUNC_ENTER(MPID_STATE_MPID_COMM_FAILURE_GET_ACKED); /* Get the group of all failed processes */ MPIDI_CH3U_Check_for_failed_procs(); MPIDI_CH3U_Get_failed_group(comm_ptr->dev.last_ack_rank, &failed_group); if (failed_group == MPID_Group_empty) { *group_ptr = MPID_Group_empty; goto fn_exit; } MPIR_Comm_group_impl(comm_ptr, &comm_group); /* Get the intersection of all falied processes in this communicator */ MPIR_Group_intersection_impl(failed_group, comm_group, group_ptr); MPIR_Group_release(comm_group); MPIR_Group_release(failed_group); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPID_COMM_FAILURE_GET_ACKED); return mpi_errno; fn_fail: goto fn_exit; }
/*@ MPI_Group_intersection - Produces a group as the intersection of two existing groups Input Parameters: + group1 - first group (handle) - group2 - second group (handle) Output Parameters: . newgroup - intersection group (handle) Notes: The output group contains those processes that are in both 'group1' and 'group2'. .N ThreadSafe .N Fortran .N Errors .N MPI_SUCCESS .N MPI_ERR_GROUP .N MPI_ERR_EXHAUSTED .seealso: MPI_Group_free @*/ int MPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup) { int mpi_errno = MPI_SUCCESS; MPIR_Group *group_ptr1 = NULL; MPIR_Group *group_ptr2 = NULL; MPIR_Group *new_group_ptr; MPIR_FUNC_TERSE_STATE_DECL(MPID_STATE_MPI_GROUP_INTERSECTION); MPIR_ERRTEST_INITIALIZED_ORDIE(); MPID_THREAD_CS_ENTER(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX); MPIR_FUNC_TERSE_ENTER(MPID_STATE_MPI_GROUP_INTERSECTION); /* Validate parameters, especially handles needing to be converted */ # ifdef HAVE_ERROR_CHECKING { MPID_BEGIN_ERROR_CHECKS; { MPIR_ERRTEST_GROUP(group1, mpi_errno); MPIR_ERRTEST_GROUP(group2, mpi_errno); } MPID_END_ERROR_CHECKS; } # endif /* Convert MPI object handles to object pointers */ MPIR_Group_get_ptr( group1, group_ptr1 ); MPIR_Group_get_ptr( group2, group_ptr2 ); /* Validate parameters and objects (post conversion) */ # ifdef HAVE_ERROR_CHECKING { MPID_BEGIN_ERROR_CHECKS; { /* Validate group_ptr */ MPIR_Group_valid_ptr( group_ptr1, mpi_errno ); MPIR_Group_valid_ptr( group_ptr2, mpi_errno ); /* If either group_ptr is not valid, it will be reset to null */ if (mpi_errno) goto fn_fail; } MPID_END_ERROR_CHECKS; } # endif /* HAVE_ERROR_CHECKING */ /* ... body of routine ... */ mpi_errno = MPIR_Group_intersection_impl(group_ptr1, group_ptr2, &new_group_ptr); if (mpi_errno) goto fn_fail; MPIR_OBJ_PUBLISH_HANDLE(*newgroup, new_group_ptr->handle); /* ... end of body of routine ... */ fn_exit: MPIR_FUNC_TERSE_EXIT(MPID_STATE_MPI_GROUP_INTERSECTION); MPID_THREAD_CS_EXIT(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX); return mpi_errno; fn_fail: /* --BEGIN ERROR HANDLING-- */ # ifdef HAVE_ERROR_CHECKING { mpi_errno = MPIR_Err_create_code( mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**mpi_group_intersection", "**mpi_group_intersection %G %G %p", group1, group2, newgroup); } # endif mpi_errno = MPIR_Err_return_comm( NULL, FCNAME, mpi_errno ); goto fn_exit; /* --END ERROR HANDLING-- */ }