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 }