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 }