00001
00002
00003
00004
00005
00006
00007
00008 #include "mpioimpl.h"
00009
00010 #ifdef HAVE_WEAK_SYMBOLS
00011
00012 #if defined(HAVE_PRAGMA_WEAK)
00013 #pragma weak MPI_File_set_view = PMPI_File_set_view
00014 #elif defined(HAVE_PRAGMA_HP_SEC_DEF)
00015 #pragma _HP_SECONDARY_DEF PMPI_File_set_view MPI_File_set_view
00016 #elif defined(HAVE_PRAGMA_CRI_DUP)
00017 #pragma _CRI duplicate MPI_File_set_view as PMPI_File_set_view
00018
00019 #endif
00020
00021
00022 #define MPIO_BUILD_PROFILING
00023 #include "mpioprof.h"
00024 #endif
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 int MPI_File_set_view(MPI_File mpi_fh, MPI_Offset disp, MPI_Datatype etype,
00040 MPI_Datatype filetype, char *datarep, MPI_Info info)
00041 {
00042 int filetype_size, etype_size, error_code;
00043 static char myname[] = "MPI_FILE_SET_VIEW";
00044 ADIO_Offset shared_fp, byte_off;
00045 ADIO_File fh;
00046
00047 MPIU_THREAD_CS_ENTER(ALLFUNC,);
00048
00049 fh = MPIO_File_resolve(mpi_fh);
00050
00051
00052 MPIO_CHECK_FILE_HANDLE(fh, myname, error_code);
00053
00054 if ((disp < 0) && (disp != MPI_DISPLACEMENT_CURRENT))
00055 {
00056 error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
00057 myname, __LINE__, MPI_ERR_ARG,
00058 "**iobaddisp", 0);
00059 error_code = MPIO_Err_return_file(fh, error_code);
00060 goto fn_exit;
00061 }
00062
00063
00064 if (etype == MPI_DATATYPE_NULL) {
00065 error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
00066 myname, __LINE__, MPI_ERR_ARG,
00067 "**ioetype", 0);
00068 error_code = MPIO_Err_return_file(fh, error_code);
00069 goto fn_exit;
00070 }
00071
00072 if (filetype == MPI_DATATYPE_NULL) {
00073 error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
00074 myname, __LINE__, MPI_ERR_ARG,
00075 "**iofiletype", 0);
00076 error_code = MPIO_Err_return_file(fh, error_code);
00077 goto fn_exit;
00078 }
00079
00080 if ((fh->access_mode & MPI_MODE_SEQUENTIAL) &&
00081 (disp != MPI_DISPLACEMENT_CURRENT))
00082 {
00083 error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
00084 myname, __LINE__, MPI_ERR_ARG,
00085 "**iodispifseq", 0);
00086 error_code = MPIO_Err_return_file(fh, error_code);
00087 goto fn_exit;
00088 }
00089
00090 if ((disp == MPI_DISPLACEMENT_CURRENT) &&
00091 !(fh->access_mode & MPI_MODE_SEQUENTIAL))
00092 {
00093 error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
00094 myname, __LINE__, MPI_ERR_ARG,
00095 "**iodispifseq", 0);
00096 error_code = MPIO_Err_return_file(fh, error_code);
00097 goto fn_exit;
00098 }
00099
00100
00101 MPI_Type_size(filetype, &filetype_size);
00102 MPI_Type_size(etype, &etype_size);
00103
00104
00105 if (filetype_size % etype_size != 0)
00106 {
00107 error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
00108 myname, __LINE__, MPI_ERR_ARG,
00109 "**iofiletype", 0);
00110 error_code = MPIO_Err_return_file(fh, error_code);
00111 goto fn_exit;
00112 }
00113
00114 if (strcmp(datarep, "native") && strcmp(datarep, "NATIVE"))
00115 {
00116 error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
00117 myname, __LINE__,
00118 MPI_ERR_UNSUPPORTED_DATAREP,
00119 "**unsupporteddatarep",0);
00120 error_code = MPIO_Err_return_file(fh, error_code);
00121 goto fn_exit;
00122 }
00123
00124
00125 if (disp == MPI_DISPLACEMENT_CURRENT) {
00126 MPI_Barrier(fh->comm);
00127 ADIO_Get_shared_fp(fh, 0, &shared_fp, &error_code);
00128
00129
00130 MPI_Barrier(fh->comm);
00131 ADIOI_Get_byte_offset(fh, shared_fp, &byte_off);
00132
00133
00134 disp = byte_off;
00135 }
00136
00137 ADIO_Set_view(fh, disp, etype, filetype, info, &error_code);
00138
00139
00140 if (error_code != MPI_SUCCESS) {
00141 error_code = MPIO_Err_return_file(fh, error_code);
00142 goto fn_exit;
00143 }
00144
00145
00146
00147 if (ADIO_Feature(fh, ADIO_SHARED_FP) &&
00148 (fh->shared_fp_fd != ADIO_FILE_NULL))
00149 {
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 ADIO_Set_shared_fp(fh, 0, &error_code);
00160
00161 if (error_code != MPI_SUCCESS)
00162 error_code = MPIO_Err_return_file(fh, error_code);
00163
00164 }
00165
00166 if (ADIO_Feature(fh, ADIO_SHARED_FP))
00167 {
00168 MPI_Barrier(fh->comm);
00169 }
00170
00171 fn_exit:
00172 MPIU_THREAD_CS_EXIT(ALLFUNC,);
00173
00174 return error_code;
00175 }