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