1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
2 /*
3 * Copyright (C) 1997 University of Chicago.
4 * See COPYRIGHT notice in top-level directory.
5 */
6
7 #include "mpioimpl.h"
8
9 #ifdef HAVE_WEAK_SYMBOLS
10
11 #if defined(HAVE_PRAGMA_WEAK)
12 #pragma weak MPI_File_seek_shared = PMPI_File_seek_shared
13 #elif defined(HAVE_PRAGMA_HP_SEC_DEF)
14 #pragma _HP_SECONDARY_DEF PMPI_File_seek_shared MPI_File_seek_shared
15 #elif defined(HAVE_PRAGMA_CRI_DUP)
16 #pragma _CRI duplicate MPI_File_seek_shared as PMPI_File_seek_shared
17 /* end of weak pragmas */
18 #endif
19
20 /* Include mapping from MPI->PMPI */
21 #define MPIO_BUILD_PROFILING
22 #include "mpioprof.h"
23 #endif
24
25 /*@
26 MPI_File_seek_shared - Updates the shared file pointer
27
28 Input Parameters:
29 . fh - file handle (handle)
30 . offset - file offset (integer)
31 . whence - update mode (state)
32
33 .N fortran
34 @*/
MPI_File_seek_shared(MPI_File mpi_fh,MPI_Offset offset,int whence)35 int MPI_File_seek_shared(MPI_File mpi_fh, MPI_Offset offset, int whence)
36 {
37 int error_code=MPI_SUCCESS, tmp_whence, myrank;
38 static char myname[] = "MPI_FILE_SEEK_SHARED";
39 MPI_Offset curr_offset, eof_offset, tmp_offset;
40 ADIO_File fh;
41
42 MPIU_THREAD_CS_ENTER(ALLFUNC,);
43
44 fh = MPIO_File_resolve(mpi_fh);
45
46 /* --BEGIN ERROR HANDLING-- */
47 MPIO_CHECK_FILE_HANDLE(fh, myname, error_code);
48 MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code);
49 MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code);
50 /* --END ERROR HANDLING-- */
51
52 tmp_offset = offset;
53 MPI_Bcast(&tmp_offset, 1, ADIO_OFFSET, 0, fh->comm);
54 /* --BEGIN ERROR HANDLING-- */
55 if (tmp_offset != offset)
56 {
57 error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
58 myname, __LINE__, MPI_ERR_ARG,
59 "**notsame", 0);
60 error_code = MPIO_Err_return_file(fh, error_code);
61 goto fn_exit;
62 }
63 /* --END ERROR HANDLING-- */
64
65 tmp_whence = whence;
66 MPI_Bcast(&tmp_whence, 1, MPI_INT, 0, fh->comm);
67 /* --BEGIN ERROR HANDLING-- */
68 if (tmp_whence != whence)
69 {
70 error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
71 myname, __LINE__, MPI_ERR_ARG,
72 "**iobadwhence", 0);
73 error_code = MPIO_Err_return_file(fh, error_code);
74 goto fn_exit;
75 }
76 /* --END ERROR HANDLING-- */
77
78 ADIOI_TEST_DEFERRED(fh, "MPI_File_seek_shared", &error_code);
79
80 MPI_Comm_rank(fh->comm, &myrank);
81
82 if (!myrank)
83 {
84 switch(whence)
85 {
86 case MPI_SEEK_SET:
87 /* --BEGIN ERROR HANDLING-- */
88 if (offset < 0)
89 {
90 error_code = MPIO_Err_create_code(MPI_SUCCESS,
91 MPIR_ERR_RECOVERABLE,
92 myname, __LINE__,
93 MPI_ERR_ARG,
94 "**iobadoffset", 0);
95 error_code = MPIO_Err_return_file(fh, error_code);
96 goto fn_exit;
97 }
98 /* --END ERROR HANDLING-- */
99 break;
100 case MPI_SEEK_CUR:
101 /* get current location of shared file pointer */
102 ADIO_Get_shared_fp(fh, 0, &curr_offset, &error_code);
103 /* --BEGIN ERROR HANDLING-- */
104 if (error_code != MPI_SUCCESS)
105 {
106 error_code = MPIO_Err_create_code(MPI_SUCCESS,
107 MPIR_ERR_FATAL,
108 myname, __LINE__,
109 MPI_ERR_INTERN,
110 "**iosharedfailed", 0);
111 error_code = MPIO_Err_return_file(fh, error_code);
112 goto fn_exit;
113 }
114 /* --END ERROR HANDLING-- */
115 offset += curr_offset;
116 /* --BEGIN ERROR HANDLING-- */
117 if (offset < 0)
118 {
119 error_code = MPIO_Err_create_code(MPI_SUCCESS,
120 MPIR_ERR_RECOVERABLE,
121 myname, __LINE__,
122 MPI_ERR_ARG,
123 "**ionegoffset", 0);
124 error_code = MPIO_Err_return_file(fh, error_code);
125 goto fn_exit;
126 }
127 /* --END ERROR HANDLING-- */
128 break;
129 case MPI_SEEK_END:
130 /* find offset corr. to end of file */
131 ADIOI_Get_eof_offset(fh, &eof_offset);
132 offset += eof_offset;
133 /* --BEGIN ERROR HANDLING-- */
134 if (offset < 0)
135 {
136 error_code = MPIO_Err_create_code(MPI_SUCCESS,
137 MPIR_ERR_RECOVERABLE,
138 myname, __LINE__,
139 MPI_ERR_ARG,
140 "**ionegoffset", 0);
141 error_code = MPIO_Err_return_file(fh, error_code);
142 goto fn_exit;
143 }
144 /* --END ERROR HANDLING-- */
145 break;
146 default:
147 /* --BEGIN ERROR HANDLING-- */
148 error_code = MPIO_Err_create_code(MPI_SUCCESS,
149 MPIR_ERR_RECOVERABLE,
150 myname, __LINE__, MPI_ERR_ARG,
151 "**iobadwhence", 0);
152 error_code = MPIO_Err_return_file(fh, error_code);
153 goto fn_exit;
154 /* --END ERROR HANDLING-- */
155 }
156
157 ADIO_Set_shared_fp(fh, offset, &error_code);
158 /* --BEGIN ERROR HANDLING-- */
159 if (error_code != MPI_SUCCESS)
160 {
161 error_code = MPIO_Err_create_code(MPI_SUCCESS,
162 MPIR_ERR_FATAL,
163 myname, __LINE__,
164 MPI_ERR_INTERN,
165 "**iosharedfailed", 0);
166 error_code = MPIO_Err_return_file(fh, error_code);
167 goto fn_exit;
168 }
169 /* --END ERROR HANDLING-- */
170
171 }
172
173 /* FIXME: explain why the barrier is necessary */
174 MPI_Barrier(fh->comm);
175
176 error_code = MPI_SUCCESS;
177
178 fn_exit:
179 MPIU_THREAD_CS_EXIT(ALLFUNC,);
180
181 return error_code;
182 }
183