00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 #include "mpioimpl.h"
00009 #include "adioi.h"
00010 
00011 #ifdef HAVE_WEAK_SYMBOLS
00012 
00013 #if defined(HAVE_PRAGMA_WEAK)
00014 #pragma weak MPI_File_seek = PMPI_File_seek
00015 #elif defined(HAVE_PRAGMA_HP_SEC_DEF)
00016 #pragma _HP_SECONDARY_DEF PMPI_File_seek MPI_File_seek
00017 #elif defined(HAVE_PRAGMA_CRI_DUP)
00018 #pragma _CRI duplicate MPI_File_seek as PMPI_File_seek
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 int MPI_File_seek(MPI_File mpi_fh, MPI_Offset offset, int whence)
00038 {
00039     int error_code;
00040     ADIO_File fh;
00041     static char myname[] = "MPI_FILE_SEEK";
00042     MPI_Offset curr_offset, eof_offset;
00043 
00044 #ifdef MPI_hpux
00045     int fl_xmpi;
00046 
00047     HPMP_IO_START(fl_xmpi, BLKMPIFILESEEK, TRDTBLOCK, fh, MPI_DATATYPE_NULL, -1);
00048 #endif 
00049 
00050     MPIU_THREAD_CS_ENTER(ALLFUNC,);
00051 
00052     fh = MPIO_File_resolve(mpi_fh);
00053 
00054     
00055     MPIO_CHECK_FILE_HANDLE(fh, myname, error_code);
00056     MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code);
00057     
00058 
00059     switch(whence) {
00060     case MPI_SEEK_SET:
00061     
00062     if (offset < 0) {
00063         error_code = MPIO_Err_create_code(MPI_SUCCESS,
00064                           MPIR_ERR_RECOVERABLE, myname,
00065                           __LINE__, MPI_ERR_ARG,
00066                           "**iobadoffset", 0);
00067         error_code = MPIO_Err_return_file(fh, error_code);
00068         goto fn_exit;
00069     }
00070     
00071     break;
00072     case MPI_SEEK_CUR:
00073     
00074     ADIOI_Get_position(fh, &curr_offset);
00075     offset += curr_offset;
00076 
00077     
00078     if (offset < 0) {
00079         error_code = MPIO_Err_create_code(MPI_SUCCESS,
00080                           MPIR_ERR_RECOVERABLE, myname,
00081                           __LINE__, MPI_ERR_ARG,
00082                           "**ionegoffset", 0);
00083         error_code = MPIO_Err_return_file(fh, error_code);
00084         goto fn_exit;
00085     }
00086     
00087 
00088     break;
00089     case MPI_SEEK_END:
00090     
00091 
00092     ADIOI_TEST_DEFERRED(fh, "MPI_File_seek", &error_code);
00093 
00094     
00095     ADIOI_Get_eof_offset(fh, &eof_offset);
00096     offset += eof_offset;
00097 
00098     
00099     if (offset < 0) {
00100         error_code = MPIO_Err_create_code(MPI_SUCCESS,
00101                           MPIR_ERR_RECOVERABLE, myname,
00102                           __LINE__, MPI_ERR_ARG,
00103                           "**ionegoffset", 0);
00104         error_code = MPIO_Err_return_file(fh, error_code);
00105         goto fn_exit;
00106     }
00107     
00108 
00109     break;
00110     default:
00111     
00112     error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
00113                       myname, __LINE__, MPI_ERR_ARG,
00114                       "**iobadwhence", 0);
00115     error_code = MPIO_Err_return_file(fh, error_code);
00116     goto fn_exit;
00117     
00118     }
00119 
00120     ADIO_SeekIndividual(fh, offset, ADIO_SEEK_SET, &error_code);
00121     
00122 
00123     
00124     if (error_code != MPI_SUCCESS)
00125     error_code = MPIO_Err_return_file(fh, error_code);
00126     
00127 
00128 #ifdef MPI_hpux
00129     HPMP_IO_END(fl_xmpi, fh, MPI_DATATYPE_NULL, -1);
00130 #endif 
00131 
00132     error_code = MPI_SUCCESS;
00133 
00134 fn_exit:
00135     MPIU_THREAD_CS_EXIT(ALLFUNC,);
00136     return error_code;
00137 }