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