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