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_set_view = PMPI_File_set_view
00015 #elif defined(HAVE_PRAGMA_HP_SEC_DEF)
00016 #pragma _HP_SECONDARY_DEF PMPI_File_set_view MPI_File_set_view
00017 #elif defined(HAVE_PRAGMA_CRI_DUP)
00018 #pragma _CRI duplicate MPI_File_set_view as PMPI_File_set_view
00019
00020 #endif
00021
00022
00023 #define MPIO_BUILD_PROFILING
00024 #include "mpioprof.h"
00025 #endif
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 int MPI_File_set_view(MPI_File fh, MPI_Offset disp, MPI_Datatype etype,
00041 MPI_Datatype filetype, char *datarep, MPI_Info info)
00042 {
00043 ADIO_Fcntl_t *fcntl_struct;
00044 int filetype_size, etype_size, error_code;
00045 #ifndef PRINT_ERR_MSG
00046 static char myname[] = "MPI_FILE_SET_VIEW";
00047 #endif
00048 ADIO_Offset shared_fp, byte_off;
00049
00050 #ifdef PRINT_ERR_MSG
00051 if ((fh <= (MPI_File) 0) || (fh->cookie != ADIOI_FILE_COOKIE)) {
00052 FPRINTF(stderr, "MPI_File_set_view: Invalid file handle\n");
00053 MPI_Abort(MPI_COMM_WORLD, 1);
00054 }
00055 #else
00056 ADIOI_TEST_FILE_HANDLE(fh, myname);
00057 #endif
00058
00059 if ((disp < 0) && (disp != MPI_DISPLACEMENT_CURRENT)) {
00060 #ifdef PRINT_ERR_MSG
00061 FPRINTF(stderr, "MPI_File_set_view: Invalid disp argument\n");
00062 MPI_Abort(MPI_COMM_WORLD, 1);
00063 #else
00064 error_code = MPIR_Err_setmsg(MPI_ERR_ARG, MPIR_ERR_DISP_ARG,
00065 myname, (char *) 0, (char *) 0);
00066 return ADIOI_Error(fh, error_code, myname);
00067 #endif
00068 }
00069
00070
00071 if (etype == MPI_DATATYPE_NULL) {
00072 #ifdef PRINT_ERR_MSG
00073 FPRINTF(stderr, "MPI_File_set_view: Invalid etype\n");
00074 MPI_Abort(MPI_COMM_WORLD, 1);
00075 #else
00076 error_code = MPIR_Err_setmsg(MPI_ERR_ARG, MPIR_ERR_ETYPE_ARG,
00077 myname, (char *) 0, (char *) 0);
00078 return ADIOI_Error(fh, error_code, myname);
00079 #endif
00080 }
00081
00082 if (filetype == MPI_DATATYPE_NULL) {
00083 #ifdef PRINT_ERR_MSG
00084 FPRINTF(stderr, "MPI_File_set_view: Invalid filetype\n");
00085 MPI_Abort(MPI_COMM_WORLD, 1);
00086 #else
00087 error_code = MPIR_Err_setmsg(MPI_ERR_ARG, MPIR_ERR_FILETYPE_ARG,
00088 myname, (char *) 0, (char *) 0);
00089 return ADIOI_Error(fh, error_code, myname);
00090 #endif
00091 }
00092
00093 if ((fh->access_mode & MPI_MODE_SEQUENTIAL) && (disp != MPI_DISPLACEMENT_CURRENT)) {
00094 #ifdef PRINT_ERR_MSG
00095 FPRINTF(stderr, "MPI_File_set_view: disp must be set to MPI_DISPLACEMENT_CURRENT since file was opened with MPI_MODE_SEQUENTIAL\n");
00096 MPI_Abort(MPI_COMM_WORLD, 1);
00097 #else
00098 error_code = MPIR_Err_setmsg(MPI_ERR_ARG, 1,
00099 myname, (char *) 0, "%s", "displacement must be set to MPI_DISPLACEMENT_CURRENT since file was opened with MPI_MODE_SEQUENTIAL");
00100 return ADIOI_Error(fh, error_code, myname);
00101 #endif
00102 }
00103
00104 if ((disp == MPI_DISPLACEMENT_CURRENT) && !(fh->access_mode & MPI_MODE_SEQUENTIAL)) {
00105 #ifdef PRINT_ERR_MSG
00106 FPRINTF(stderr, "MPI_File_set_view: disp can be set to MPI_DISPLACEMENT_CURRENT only if file was opened with MPI_MODE_SEQUENTIAL\n");
00107 MPI_Abort(MPI_COMM_WORLD, 1);
00108 #else
00109 error_code = MPIR_Err_setmsg(MPI_ERR_ARG, 1,
00110 myname, (char *) 0, "%s", "displacement can be set to MPI_DISPLACEMENT_CURRENT only if file was opened with MPI_MODE_SEQUENTIAL");
00111 return ADIOI_Error(fh, error_code, myname);
00112 #endif
00113 }
00114
00115 MPI_Type_size(filetype, &filetype_size);
00116 MPI_Type_size(etype, &etype_size);
00117 if (filetype_size % etype_size != 0) {
00118 #ifdef PRINT_ERR_MSG
00119 FPRINTF(stderr, "MPI_File_set_view: Filetype must be constructed out of one or more etypes\n");
00120 MPI_Abort(MPI_COMM_WORLD, 1);
00121 #else
00122 error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ERR_FILETYPE,
00123 myname, (char *) 0, (char *) 0);
00124 return ADIOI_Error(fh, error_code, myname);
00125 #endif
00126 }
00127
00128 if (strcmp(datarep, "native") && strcmp(datarep, "NATIVE")) {
00129 #ifdef PRINT_ERR_MSG
00130 FPRINTF(stderr, "MPI_File_set_view: Only \"native\" data representation currently supported\n");
00131 MPI_Abort(MPI_COMM_WORLD, 1);
00132 #else
00133 error_code = MPIR_Err_setmsg(MPI_ERR_UNSUPPORTED_DATAREP,
00134 MPIR_ERR_NOT_NATIVE_DATAREP, myname, (char *) 0, (char *) 0);
00135 return ADIOI_Error(fh, error_code, myname);
00136 #endif
00137 }
00138
00139 fcntl_struct = (ADIO_Fcntl_t *) ADIOI_Malloc(sizeof(ADIO_Fcntl_t));
00140 fcntl_struct->disp = disp;
00141 fcntl_struct->etype = etype;
00142 fcntl_struct->filetype = filetype;
00143 fcntl_struct->info = info;
00144 fcntl_struct->iomode = fh->iomode;
00145
00146 if (disp == MPI_DISPLACEMENT_CURRENT) {
00147 MPI_Barrier(fh->comm);
00148 ADIO_Get_shared_fp(fh, 0, &shared_fp, &error_code);
00149
00150
00151 ADIOI_Get_byte_offset(fh, shared_fp, &byte_off);
00152 fcntl_struct->disp = byte_off;
00153 }
00154
00155 ADIO_Fcntl(fh, ADIO_FCNTL_SET_VIEW, fcntl_struct, &error_code);
00156
00157
00158
00159 if ((fh->file_system != ADIO_PIOFS) && (fh->file_system != ADIO_PVFS) &&
00160 (fh->shared_fp_fd != ADIO_FILE_NULL))
00161 ADIO_Set_shared_fp(fh, 0, &error_code);
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171 if ((fh->file_system != ADIO_PIOFS) && (fh->file_system != ADIO_PVFS))
00172 MPI_Barrier(fh->comm);
00173
00174 ADIOI_Free(fcntl_struct);
00175 return error_code;
00176 }