-:    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:}