1 /*
2  * Copyright (C) by Argonne National Laboratory
3  *     See COPYRIGHT in top-level directory
4  */
5 
6 #include "mpiimpl.h"
7 #include "mpir_ext.h"
8 
9 /* -- Begin Profiling Symbol Block for routine MPI_File_get_errhandler */
10 #if defined(HAVE_PRAGMA_WEAK)
11 #pragma weak MPI_File_get_errhandler = PMPI_File_get_errhandler
12 #elif defined(HAVE_PRAGMA_HP_SEC_DEF)
13 #pragma _HP_SECONDARY_DEF PMPI_File_get_errhandler  MPI_File_get_errhandler
14 #elif defined(HAVE_PRAGMA_CRI_DUP)
15 #pragma _CRI duplicate MPI_File_get_errhandler as PMPI_File_get_errhandler
16 #elif defined(HAVE_WEAK_ATTRIBUTE)
17 int MPI_File_get_errhandler(MPI_File file, MPI_Errhandler * errhandler)
18     __attribute__ ((weak, alias("PMPI_File_get_errhandler")));
19 #endif
20 /* -- End Profiling Symbol Block */
21 
22 /* Define MPICH_MPI_FROM_PMPI if weak symbols are not supported to build
23    the MPI routines */
24 #ifndef MPICH_MPI_FROM_PMPI
25 #undef MPI_File_get_errhandler
26 #define MPI_File_get_errhandler PMPI_File_get_errhandler
27 
28 #endif
29 
30 /*@
31    MPI_File_get_errhandler - Get the error handler attached to a file
32 
33 Input Parameters:
34 . file - MPI file (handle)
35 
36 Output Parameters:
37 . errhandler - handler currently associated with file (handle)
38 
39 .N ThreadSafeNoUpdate
40 
41 .N Fortran
42 
43 .N Errors
44 .N MPI_SUCCESS
45 @*/
MPI_File_get_errhandler(MPI_File file,MPI_Errhandler * errhandler)46 int MPI_File_get_errhandler(MPI_File file, MPI_Errhandler * errhandler)
47 {
48     int mpi_errno = MPI_SUCCESS;
49 #ifdef MPI_MODE_RDONLY
50     MPI_Errhandler eh;
51     MPIR_Errhandler *e;
52 #endif
53     MPIR_FUNC_TERSE_STATE_DECL(MPID_STATE_MPI_FILE_GET_ERRHANDLER);
54 
55     MPIR_ERRTEST_INITIALIZED_ORDIE();
56 
57     MPID_THREAD_CS_ENTER(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX);
58     MPIR_FUNC_TERSE_ENTER(MPID_STATE_MPI_FILE_GET_ERRHANDLER);
59 
60 #ifdef MPI_MODE_RDONLY
61     /* Validate parameters, especially handles needing to be converted */
62     /* FIXME: check for a valid file handle (fh) before converting to a pointer */
63 
64     /* Validate parameters and objects (post conversion) */
65 #ifdef HAVE_ERROR_CHECKING
66     {
67         MPID_BEGIN_ERROR_CHECKS;
68         {
69             MPIR_ERRTEST_ARGNULL(errhandler, "errhandler", mpi_errno);
70         }
71         MPID_END_ERROR_CHECKS;
72     }
73 #endif /* HAVE_ERROR_CHECKING */
74 
75     /* ... body of routine ...  */
76 
77     MPIR_ROMIO_Get_file_errhand(file, &eh);
78     if (!eh) {
79         MPIR_Errhandler_get_ptr(MPI_ERRORS_RETURN, e);
80     } else {
81         MPIR_Errhandler_get_ptr(eh, e);
82     }
83     MPIR_Errhandler_add_ref(e);
84     *errhandler = e->handle;
85 
86 #else
87     /* Dummy in case ROMIO is not defined */
88     mpi_errno = MPI_ERR_INTERN;
89 #ifdef HAVE_ERROR_CHECKING
90     if (0)
91         goto fn_fail;   /* quiet compiler warning about unused label */
92 #endif
93 #endif
94     /* ... end of body of routine ... */
95 
96 #ifdef HAVE_ERROR_CHECKING
97   fn_exit:
98 #endif
99     MPIR_FUNC_TERSE_EXIT(MPID_STATE_MPI_FILE_GET_ERRHANDLER);
100     MPID_THREAD_CS_EXIT(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX);
101     return mpi_errno;
102 
103     /* --BEGIN ERROR HANDLING-- */
104 #ifdef HAVE_ERROR_CHECKING
105   fn_fail:
106     {
107         mpi_errno =
108             MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, __func__, __LINE__, MPI_ERR_OTHER,
109                                  "**mpi_file_get_errhandler", "**mpi_file_get_errhandler %F %p",
110                                  file, errhandler);
111     }
112     /* FIXME: Is this obsolete now? */
113 #ifdef MPI_MODE_RDONLY
114     mpi_errno = MPIO_Err_return_file(file, mpi_errno);
115 #endif
116     goto fn_exit;
117 #endif
118     /* --END ERROR HANDLING-- */
119 }
120