00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "mpioimpl.h"
00010
00011 #ifdef HAVE_WEAK_SYMBOLS
00012
00013 #if defined(HAVE_PRAGMA_WEAK)
00014 #pragma weak MPI_File_open = PMPI_File_open
00015 #elif defined(HAVE_PRAGMA_HP_SEC_DEF)
00016 #pragma _HP_SECONDARY_DEF PMPI_File_open MPI_File_open
00017 #elif defined(HAVE_PRAGMA_CRI_DUP)
00018 #pragma _CRI duplicate MPI_File_open as PMPI_File_open
00019
00020 #endif
00021
00022
00023 #define MPIO_BUILD_PROFILING
00024 #include "mpioprof.h"
00025 #endif
00026
00027 extern int ADIO_Init_keyval;
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 int MPI_File_open(MPI_Comm comm, char *filename, int amode,
00044 MPI_Info info, MPI_File *fh)
00045 {
00046 int error_code, file_system, flag, rank, orig_amode;
00047 #ifndef PRINT_ERR_MSG
00048 static char myname[] = "MPI_FILE_OPEN";
00049 #endif
00050 char *tmp;
00051 MPI_Comm dupcomm, dupcommself;
00052 ADIOI_Fns *fsops;
00053
00054 #ifdef MPI_hpux
00055 int fl_xmpi;
00056
00057 HPMP_IO_OPEN_START(fl_xmpi, comm);
00058 #endif
00059
00060 if (comm == MPI_COMM_NULL) {
00061 #ifdef PRINT_ERR_MSG
00062 FPRINTF(stderr, "MPI_File_open: Invalid communicator\n");
00063 MPI_Abort(MPI_COMM_WORLD, 1);
00064 #else
00065 error_code = MPIR_Err_setmsg(MPI_ERR_COMM, MPIR_ERR_COMM_NULL,
00066 myname, (char *) 0, (char *) 0);
00067 return ADIOI_Error(MPI_FILE_NULL, error_code, myname);
00068 #endif
00069 }
00070
00071 MPI_Comm_test_inter(comm, &flag);
00072 if (flag) {
00073 #ifdef PRINT_ERR_MSG
00074 FPRINTF(stderr, "MPI_File_open: Intercommunicator cannot be passed to MPI_File_open\n");
00075 MPI_Abort(MPI_COMM_WORLD, 1);
00076 #else
00077 error_code = MPIR_Err_setmsg(MPI_ERR_COMM, MPIR_ERR_COMM_INTER,
00078 myname, (char *) 0, (char *) 0);
00079 return ADIOI_Error(MPI_FILE_NULL, error_code, myname);
00080 #endif
00081 }
00082
00083 if ( ((amode&MPI_MODE_RDONLY)?1:0) + ((amode&MPI_MODE_RDWR)?1:0) +
00084 ((amode&MPI_MODE_WRONLY)?1:0) != 1 ) {
00085 #ifdef PRINT_ERR_MSG
00086 FPRINTF(stderr, "MPI_File_open: Exactly one of MPI_MODE_RDONLY, MPI_MODE_WRONLY, or MPI_MODE_RDWR must be specified\n");
00087 MPI_Abort(MPI_COMM_WORLD, 1);
00088 #else
00089 error_code = MPIR_Err_setmsg(MPI_ERR_AMODE, 3,
00090 myname, (char *) 0, (char *) 0);
00091 return ADIOI_Error(MPI_FILE_NULL, error_code, myname);
00092 #endif
00093 }
00094
00095 if ((amode & MPI_MODE_RDONLY) &&
00096 ((amode & MPI_MODE_CREATE) || (amode & MPI_MODE_EXCL))) {
00097 #ifdef PRINT_ERR_MSG
00098 FPRINTF(stderr, "MPI_File_open: It is erroneous to specify MPI_MODE_CREATE or MPI_MODE_EXCL with MPI_MODE_RDONLY\n");
00099 MPI_Abort(MPI_COMM_WORLD, 1);
00100 #else
00101 error_code = MPIR_Err_setmsg(MPI_ERR_AMODE, 5,
00102 myname, (char *) 0, (char *) 0);
00103 return ADIOI_Error(MPI_FILE_NULL, error_code, myname);
00104 #endif
00105 }
00106
00107 if ((amode & MPI_MODE_RDWR) && (amode & MPI_MODE_SEQUENTIAL)) {
00108 #ifdef PRINT_ERR_MSG
00109 FPRINTF(stderr, "MPI_File_open: It is erroneous to specify MPI_MODE_SEQUENTIAL with MPI_MODE_RDWR\n");
00110 MPI_Abort(MPI_COMM_WORLD, 1);
00111 #else
00112 error_code = MPIR_Err_setmsg(MPI_ERR_AMODE, 7,
00113 myname, (char *) 0, (char *) 0);
00114 return ADIOI_Error(MPI_FILE_NULL, error_code, myname);
00115 #endif
00116 }
00117
00118
00119 MPI_Comm_dup(comm, &dupcomm);
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 if (ADIO_Init_keyval == MPI_KEYVAL_INVALID) {
00133
00134
00135
00136 MPI_Initialized(&flag);
00137 if (!flag) {
00138 FPRINTF(stderr, "Error: MPI_Init() must be called before using MPI-IO\n");
00139 MPI_Abort(MPI_COMM_WORLD, 1);
00140 }
00141
00142 MPI_Keyval_create(MPI_NULL_COPY_FN, ADIOI_End_call, &ADIO_Init_keyval,
00143 (void *) 0);
00144
00145
00146
00147
00148
00149
00150 MPI_Attr_put(MPI_COMM_WORLD, ADIO_Init_keyval, (void *) 0);
00151
00152
00153
00154 ADIO_Init( (int *)0, (char ***)0, &error_code);
00155 }
00156
00157
00158 file_system = -1;
00159
00160
00161 ADIO_ResolveFileType(dupcomm, filename, &file_system, &fsops, &error_code);
00162 if (error_code != MPI_SUCCESS) {
00163
00164
00165
00166
00167
00168 #ifdef PRINT_ERR_MSG
00169 MPI_Abort(MPI_COMM_WORLD, 1);
00170 #else
00171 return ADIOI_Error(MPI_FILE_NULL, error_code, myname);
00172 #endif
00173 }
00174
00175
00176
00177
00178
00179
00180
00181 if (((file_system == ADIO_PIOFS) || (file_system == ADIO_PVFS)) &&
00182 (amode & MPI_MODE_SEQUENTIAL)) {
00183 #ifdef PRINT_ERR_MSG
00184 FPRINTF(stderr, "MPI_File_open: MPI_MODE_SEQUENTIAL not supported on PIOFS and PVFS\n");
00185 MPI_Abort(MPI_COMM_WORLD, 1);
00186 #else
00187 error_code = MPIR_Err_setmsg(MPI_ERR_UNSUPPORTED_OPERATION,
00188 MPIR_ERR_NO_MODE_SEQ, myname, (char *) 0, (char *) 0);
00189 return ADIOI_Error(MPI_FILE_NULL, error_code, myname);
00190 #endif
00191 }
00192
00193
00194 tmp = strchr(filename, ':');
00195
00196
00197 if (tmp > filename + 1)
00198 filename = tmp + 1;
00199
00200 orig_amode = amode;
00201 MPI_Comm_rank(dupcomm, &rank);
00202
00203 if ((amode & MPI_MODE_CREATE) && (amode & MPI_MODE_EXCL)) {
00204
00205
00206
00207
00208
00209 if (!rank) {
00210 MPI_Comm_dup(MPI_COMM_SELF, &dupcommself);
00211
00212
00213
00214 *fh = ADIO_Open(MPI_COMM_SELF, dupcommself, filename, file_system, amode,
00215 0, MPI_BYTE, MPI_BYTE, M_ASYNC, info,
00216 ADIO_PERM_NULL, &error_code);
00217
00218 MPI_Bcast(&error_code, 1, MPI_INT, 0, dupcomm);
00219
00220
00221 if (error_code == MPI_SUCCESS) ADIO_Close(*fh, &error_code);
00222 }
00223 else MPI_Bcast(&error_code, 1, MPI_INT, 0, dupcomm);
00224
00225 if (error_code != MPI_SUCCESS) {
00226 MPI_Comm_free(&dupcomm);
00227 *fh = MPI_FILE_NULL;
00228 #ifdef MPI_hpux
00229 HPMP_IO_OPEN_END(fl_xmpi, *fh, comm);
00230 #endif
00231 return error_code;
00232 }
00233 else amode = amode ^ MPI_MODE_EXCL;
00234 }
00235
00236
00237
00238
00239
00240 *fh = ADIO_Open(comm, dupcomm, filename, file_system, amode, 0, MPI_BYTE,
00241 MPI_BYTE, M_ASYNC, info, ADIO_PERM_NULL, &error_code);
00242
00243
00244 if ((error_code == MPI_SUCCESS) && (amode != orig_amode))
00245 (*fh)->access_mode = orig_amode;
00246
00247
00248
00249
00250 if ((error_code == MPI_SUCCESS) && ((*fh)->file_system != ADIO_PIOFS)
00251 && ((*fh)->file_system != ADIO_PVFS)) {
00252 ADIOI_Shfp_fname(*fh, rank);
00253
00254
00255
00256
00257 if ((*fh)->access_mode & MPI_MODE_APPEND) {
00258 if (!rank) ADIO_Set_shared_fp(*fh, (*fh)->fp_ind, &error_code);
00259 MPI_Barrier(dupcomm);
00260 }
00261 }
00262
00263 #ifdef MPI_hpux
00264 HPMP_IO_OPEN_END(fl_xmpi, *fh, comm);
00265 #endif
00266 return error_code;
00267 }
00268
00269
00270
00271
00272 int MPIR_Err_setmsg( int a, int b, const char *c, const char *d, const char *e, ...){
00273 return 0;
00274 }
00275