-: 0:Source:/home/MPI/testing/mpich2/mpich2/src/mpi/errhan/comm_call_errhandler.c
-: 0:Graph:comm_call_errhandler.gcno
-: 0:Data:comm_call_errhandler.gcda
-: 0:Runs:628
-: 0:Programs:176
-: 1:/* -*- Mode: C; c-basic-offset:4 ; -*- */
-: 2:/*
-: 3: *
-: 4: * (C) 2001 by Argonne National Laboratory.
-: 5: * See COPYRIGHT in top-level directory.
-: 6: */
-: 7:
-: 8:#include "mpiimpl.h"
-: 9:
-: 10:/* -- Begin Profiling Symbol Block for routine MPI_Comm_call_errhandler */
-: 11:#if defined(HAVE_PRAGMA_WEAK)
-: 12:#pragma weak MPI_Comm_call_errhandler = PMPI_Comm_call_errhandler
-: 13:#elif defined(HAVE_PRAGMA_HP_SEC_DEF)
-: 14:#pragma _HP_SECONDARY_DEF PMPI_Comm_call_errhandler MPI_Comm_call_errhandler
-: 15:#elif defined(HAVE_PRAGMA_CRI_DUP)
-: 16:#pragma _CRI duplicate MPI_Comm_call_errhandler as PMPI_Comm_call_errhandler
-: 17:#endif
-: 18:/* -- End Profiling Symbol Block */
-: 19:
-: 20:/* Define MPICH_MPI_FROM_PMPI if weak symbols are not supported to build
-: 21: the MPI routines */
-: 22:#ifndef MPICH_MPI_FROM_PMPI
-: 23:#undef MPI_Comm_call_errhandler
-: 24:#define MPI_Comm_call_errhandler PMPI_Comm_call_errhandler
-: 25:
-: 26:#endif
-: 27:
-: 28:#undef FUNCNAME
-: 29:#define FUNCNAME MPI_Comm_call_errhandler
-: 30:#undef FCNAME
-: 31:#define FCNAME "MPI_Comm_call_errhandler"
-: 32:
-: 33:/*@
-: 34: MPI_Comm_call_errhandler - Call the error handler installed on a
-: 35: communicator
-: 36:
-: 37: Input Parameters:
-: 38:+ comm - communicator with error handler (handle)
-: 39:- errorcode - error code (integer)
-: 40:
-: 41: Note:
-: 42: Assuming the input parameters are valid, when the error handler is set to
-: 43: MPI_ERRORS_RETURN, this routine will always return MPI_SUCCESS.
-: 44:
-: 45:.N ThreadSafeNoUpdate
-: 46:
-: 47:.N Fortran
-: 48:
-: 49:.N Errors
-: 50:.N MPI_SUCCESS
-: 51:.N MPI_ERR_COMM
-: 52:@*/
-: 53:int MPI_Comm_call_errhandler(MPI_Comm comm, int errorcode)
8009: 54:{
8009: 55: int mpi_errno = MPI_SUCCESS;
8009: 56: MPID_Comm *comm_ptr = NULL;
8009: 57: MPIU_THREADPRIV_DECL;
-: 58: MPID_MPI_STATE_DECL(MPID_STATE_MPI_COMM_CALL_ERRHANDLER);
-: 59:
8009: 60: MPIR_ERRTEST_INITIALIZED_ORDIE();
-: 61:
-: 62: MPID_MPI_FUNC_ENTER(MPID_STATE_MPI_COMM_CALL_ERRHANDLER);
-: 63:
8009: 64: MPIU_THREADPRIV_GET;
-: 65:
-: 66: /* Validate parameters, especially handles needing to be converted */
|
-: 67:# ifdef HAVE_ERROR_CHECKING
-: 68: {
-: 69: MPID_BEGIN_ERROR_CHECKS;
-: 70: {
8009: 71: MPIR_ERRTEST_COMM(comm, mpi_errno);
8009: 72: if (mpi_errno != MPI_SUCCESS) goto fn_fail;
-: 73: }
-: 74: MPID_END_ERROR_CHECKS;
-: 75: }
-: 76:# endif
-: 77:
-: 78: /* Convert MPI object handles to object pointers */
|
8009: 79: MPID_Comm_get_ptr( comm, comm_ptr );
-: 80:
-: 81: /* Validate parameters and objects (post conversion) */
|
-: 82:# ifdef HAVE_ERROR_CHECKING
-: 83: {
-: 84: MPID_BEGIN_ERROR_CHECKS;
-: 85: {
-: 86: /* Validate comm_ptr; if comm_ptr is not value, it will be reset
-: 87: to null */
8009: 88: MPID_Comm_valid_ptr( comm_ptr, mpi_errno );
8009: 89: if (mpi_errno != MPI_SUCCESS) goto fn_fail;
-: 90:
8009: 91: if (comm_ptr->errhandler) {
8008: 92: MPIR_ERRTEST_ERRHANDLER(comm_ptr->errhandler->handle,mpi_errno);
8008: 93: if (mpi_errno) goto fn_fail;
-: 94: }
-: 95: }
-: 96: MPID_END_ERROR_CHECKS;
-: 97: }
-: 98:# endif /* HAVE_ERROR_CHECKING */
-: 99:
-: 100: /* ... body of routine ... */
-: 101:
-: 102: /* Check for predefined error handlers */
|
8009: 103: if (!comm_ptr->errhandler ||
-: 104: comm_ptr->errhandler->handle == MPI_ERRORS_ARE_FATAL) {
|
1: 105: mpi_errno = MPIR_Err_return_comm( comm_ptr, "MPI_Comm_call_errhandler", errorcode );
|
#####: 106: goto fn_exit;
-: 107: }
-: 108:
|
8008: 109: if (comm_ptr->errhandler->handle == MPI_ERRORS_RETURN) {
-: 110: /* MPI_ERRORS_RETURN should always return MPI_SUCCESS */
|
#####: 111: goto fn_exit;
-: 112: }
-: 113:
-: 114: /* Check for the special case of errors-throw-exception. In this case
-: 115: return the error code; the C++ wrapper will cause an exception to
-: 116: be thrown.
-: 117: */
-: 118:#ifdef HAVE_CXX_BINDING
|
8008: 119: if (comm_ptr->errhandler->handle == MPIR_ERRORS_THROW_EXCEPTIONS) {
|
#####: 120: mpi_errno = errorcode;
#####: 121: goto fn_exit;
-: 122: }
-: 123:#endif
-: 124:
-: 125: /* The user error handler may make calls to MPI routines, so the nesting
-: 126: * counter must be incremented before the handler is called */
|
8008: 127: MPIR_Nest_incr();
-: 128:
-: 129: /* Process any user-defined error handling function */
8008: 130: switch (comm_ptr->errhandler->language) {
-: 131: case MPID_LANG_C:
-: 132:#ifdef HAVE_CXX_BINDING
-: 133: case MPID_LANG_CXX:
-: 134:#endif
8008: 135: (*comm_ptr->errhandler->errfn.C_Comm_Handler_function)(
-: 136: &comm_ptr->handle, &errorcode );
8008: 137: break;
-: 138:#ifdef HAVE_FORTRAN_BINDING
-: 139: case MPID_LANG_FORTRAN90:
-: 140: case MPID_LANG_FORTRAN:
|
#####: 141: (*comm_ptr->errhandler->errfn.F77_Handler_function)(
-: 142: (MPI_Fint *)&comm_ptr->handle, &errorcode );
-: 143: break;
-: 144:#endif
-: 145: }
-: 146:
|
8008: 147: MPIR_Nest_decr();
-: 148:
-: 149: /* ... end of body of routine ... */
-: 150:
8008: 151: fn_exit:
|
-: 152: MPID_MPI_FUNC_EXIT(MPID_STATE_MPI_COMM_CALL_ERRHANDLER);
|
8008: 153: return mpi_errno;
-: 154:
|
-: 155: /* --BEGIN ERROR HANDLING-- */
-: 156:# ifdef HAVE_ERROR_CHECKING
#####: 157: fn_fail:
-: 158: {
#####: 159: mpi_errno = MPIR_Err_create_code(
-: 160: mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,
-: 161: "**mpi_comm_call_errhandler",
-: 162: "**mpi_comm_call_errhandler %C %d", comm, errorcode);
-: 163: }
#####: 164: mpi_errno = MPIR_Err_return_comm( comm_ptr, FCNAME, mpi_errno );
#####: 165: goto fn_exit;
-: 166:# endif
-: 167: /* --END ERROR HANDLING-- */
-: 168:}
|