-:    0:Source:/home/MPI/testing/mpich2/mpich2/src/mpi/errhan/win_call_errhandler.c
        -:    0:Graph:win_call_errhandler.gcno
        -:    0:Data:win_call_errhandler.gcda
        -:    0:Runs:516
        -:    0:Programs:140
        -:    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_Win_call_errhandler */
        -:   11:#if defined(HAVE_PRAGMA_WEAK)
        -:   12:#pragma weak MPI_Win_call_errhandler = PMPI_Win_call_errhandler
        -:   13:#elif defined(HAVE_PRAGMA_HP_SEC_DEF)
        -:   14:#pragma _HP_SECONDARY_DEF PMPI_Win_call_errhandler  MPI_Win_call_errhandler
        -:   15:#elif defined(HAVE_PRAGMA_CRI_DUP)
        -:   16:#pragma _CRI duplicate MPI_Win_call_errhandler as PMPI_Win_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_Win_call_errhandler
        -:   24:#define MPI_Win_call_errhandler PMPI_Win_call_errhandler
        -:   25:
        -:   26:#endif
        -:   27:
        -:   28:#undef FUNCNAME
        -:   29:#define FUNCNAME MPI_Win_call_errhandler
        -:   30:#undef FCNAME
        -:   31:#define FCNAME "MPI_Win_call_errhander"
        -:   32:
        -:   33:/*@
        -:   34:   MPI_Win_call_errhandler - Call the error handler installed on a 
        -:   35:   window object
        -:   36:
        -:   37:   Input Parameters:
        -:   38:+ win - window 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_WIN
        -:   52:@*/
        -:   53:int MPI_Win_call_errhandler(MPI_Win win, int errorcode)
     2009:   54:{
     2009:   55:    int mpi_errno = MPI_SUCCESS;
     2009:   56:    MPID_Win *win_ptr = NULL;
     2009:   57:    MPIU_THREADPRIV_DECL;
        -:   58:    MPID_MPI_STATE_DECL(MPID_STATE_MPI_WIN_CALL_ERRHANDLER);
        -:   59:
     2009:   60:    MPIR_ERRTEST_INITIALIZED_ORDIE();
        -:   61:    
        -:   62:    MPID_MPI_FUNC_ENTER(MPID_STATE_MPI_WIN_CALL_ERRHANDLER);
        -:   63:
     2009:   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:        {
     2009:   71:	    MPIR_ERRTEST_WIN(win, mpi_errno);
     2009:   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 */
     2009:   79:    MPID_Win_get_ptr( win, win_ptr );
        -:   80:    
        -:   81:    /* Validate parameters and objects (post conversion) */
        -:   82:#   ifdef HAVE_ERROR_CHECKING
        -:   83:    {
        -:   84:        MPID_BEGIN_ERROR_CHECKS;
        -:   85:        {
        -:   86:            /* Validate win_ptr */
     2009:   87:            MPID_Win_valid_ptr( win_ptr, mpi_errno );
        -:   88:	    /* If win_ptr is not valid, it will be reset to null */
     2009:   89:            if (mpi_errno) goto fn_fail;
        -:   90:        }
        -:   91:        MPID_END_ERROR_CHECKS;
        -:   92:    }
        -:   93:#   endif /* HAVE_ERROR_CHECKING */
        -:   94:
        -:   95:    /* ... body of routine ...  */
        -:   96:    
     2009:   97:    if (!win_ptr->errhandler || 
        -:   98:	win_ptr->errhandler->handle == MPI_ERRORS_ARE_FATAL) {
    #####:   99:	mpi_errno = MPIR_Err_return_win( win_ptr, "MPI_Win_call_errhandler", errorcode );
    #####:  100:	goto fn_exit;
        -:  101:    }
        -:  102:
     2009:  103:    if (win_ptr->errhandler->handle == MPI_ERRORS_RETURN) {
        -:  104:	/* MPI_ERRORS_RETURN should always return MPI_SUCCESS */
    #####:  105:	goto fn_exit;
        -:  106:    }
        -:  107:
        -:  108:    /* Check for the special case of errors-throw-exception.  In this case
        -:  109:       return the error code; the C++ wrapper will cause an exception to
        -:  110:       be thrown.
        -:  111:       */
        -:  112:#ifdef HAVE_CXX_BINDING
     2009:  113:    if (win_ptr->errhandler->handle == MPIR_ERRORS_THROW_EXCEPTIONS) {
    #####:  114:	mpi_errno = errorcode;
    #####:  115:	goto fn_exit;
        -:  116:    }
        -:  117:#endif
        -:  118:    /* The user error handler may make calls to MPI routines, so the nesting
        -:  119:     * counter must be incremented before the handler is called */
     2009:  120:    MPIR_Nest_incr();
        -:  121:    
     2009:  122:    switch (win_ptr->errhandler->language) {
        -:  123:    case MPID_LANG_C:
        -:  124:#ifdef HAVE_CXX_BINDING
        -:  125:    case MPID_LANG_CXX:
        -:  126:#endif
     2009:  127:	(*win_ptr->errhandler->errfn.C_Win_Handler_function)( 
        -:  128:	    &win_ptr->handle, &errorcode );
     2009:  129:	break;
        -:  130:#ifdef HAVE_FORTRAN_BINDING
        -:  131:    case MPID_LANG_FORTRAN90:
        -:  132:    case MPID_LANG_FORTRAN:
    #####:  133:	(*win_ptr->errhandler->errfn.F77_Handler_function)( 
        -:  134:	    (MPI_Fint *)&win_ptr->handle, &errorcode );
        -:  135:	break;
        -:  136:#endif
        -:  137:    }
        -:  138:    
     2009:  139:    MPIR_Nest_decr();
        -:  140:    
        -:  141:    /* ... end of body of routine ... */
        -:  142:
     2009:  143:  fn_exit:
        -:  144:    MPID_MPI_FUNC_EXIT(MPID_STATE_MPI_WIN_CALL_ERRHANDLER);
     2009:  145:    return mpi_errno;
        -:  146:
        -:  147:    /* --BEGIN ERROR HANDLING-- */
        -:  148:#   ifdef HAVE_ERROR_CHECKING
    #####:  149:  fn_fail:
        -:  150:    {
    #####:  151:	mpi_errno = MPIR_Err_create_code(
        -:  152:	    mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, 
        -:  153:	    "**mpi_win_call_errhandler", 
        -:  154:	    "**mpi_win_call_errhandler %W %d", win, errorcode);
        -:  155:    }
    #####:  156:    mpi_errno = MPIR_Err_return_win(win_ptr, FCNAME, mpi_errno);
    #####:  157:    goto fn_exit;
        -:  158:#   endif
        -:  159:    /* --END ERROR HANDLING-- */
        -:  160:}