00001
00002
00003
00004
00005
00006
00007 #include "mpioimpl.h"
00008
00009 #ifdef HAVE_WEAK_SYMBOLS
00010
00011 #if defined(HAVE_PRAGMA_WEAK)
00012 #pragma weak MPI_File_seek_shared = PMPI_File_seek_shared
00013 #elif defined(HAVE_PRAGMA_HP_SEC_DEF)
00014 #pragma _HP_SECONDARY_DEF PMPI_File_seek_shared MPI_File_seek_shared
00015 #elif defined(HAVE_PRAGMA_CRI_DUP)
00016 #pragma _CRI duplicate MPI_File_seek_shared as PMPI_File_seek_shared
00017
00018 #endif
00019
00020
00021 #define MPIO_BUILD_PROFILING
00022 #include "mpioprof.h"
00023 #endif
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 int MPI_File_seek_shared(MPI_File mpi_fh, MPI_Offset offset, int whence)
00036 {
00037 int error_code=MPI_SUCCESS, tmp_whence, myrank;
00038 static char myname[] = "MPI_FILE_SEEK_SHARED";
00039 MPI_Offset curr_offset, eof_offset, tmp_offset;
00040 ADIO_File fh;
00041
00042 MPIU_THREAD_CS_ENTER(ALLFUNC,);
00043
00044 fh = MPIO_File_resolve(mpi_fh);
00045
00046
00047 MPIO_CHECK_FILE_HANDLE(fh, myname, error_code);
00048 MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code);
00049 MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code);
00050
00051
00052 tmp_offset = offset;
00053 MPI_Bcast(&tmp_offset, 1, ADIO_OFFSET, 0, fh->comm);
00054
00055 if (tmp_offset != offset)
00056 {
00057 error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
00058 myname, __LINE__, MPI_ERR_ARG,
00059 "**notsame", 0);
00060 error_code = MPIO_Err_return_file(fh, error_code);
00061 goto fn_exit;
00062 }
00063
00064
00065 tmp_whence = whence;
00066 MPI_Bcast(&tmp_whence, 1, MPI_INT, 0, fh->comm);
00067
00068 if (tmp_whence != whence)
00069 {
00070 error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
00071 myname, __LINE__, MPI_ERR_ARG,
00072 "**iobadwhence", 0);
00073 error_code = MPIO_Err_return_file(fh, error_code);
00074 goto fn_exit;
00075 }
00076
00077
00078 ADIOI_TEST_DEFERRED(fh, "MPI_File_seek_shared", &error_code);
00079
00080 MPI_Comm_rank(fh->comm, &myrank);
00081
00082 if (!myrank)
00083 {
00084 switch(whence)
00085 {
00086 case MPI_SEEK_SET:
00087
00088 if (offset < 0)
00089 {
00090 error_code = MPIO_Err_create_code(MPI_SUCCESS,
00091 MPIR_ERR_RECOVERABLE,
00092 myname, __LINE__,
00093 MPI_ERR_ARG,
00094 "**iobadoffset", 0);
00095 error_code = MPIO_Err_return_file(fh, error_code);
00096 goto fn_exit;
00097 }
00098
00099 break;
00100 case MPI_SEEK_CUR:
00101
00102 ADIO_Get_shared_fp(fh, 0, &curr_offset, &error_code);
00103
00104 if (error_code != MPI_SUCCESS)
00105 {
00106 error_code = MPIO_Err_create_code(MPI_SUCCESS,
00107 MPIR_ERR_FATAL,
00108 myname, __LINE__,
00109 MPI_ERR_INTERN,
00110 "**iosharedfailed", 0);
00111 error_code = MPIO_Err_return_file(fh, error_code);
00112 goto fn_exit;
00113 }
00114
00115 offset += curr_offset;
00116
00117 if (offset < 0)
00118 {
00119 error_code = MPIO_Err_create_code(MPI_SUCCESS,
00120 MPIR_ERR_RECOVERABLE,
00121 myname, __LINE__,
00122 MPI_ERR_ARG,
00123 "**ionegoffset", 0);
00124 error_code = MPIO_Err_return_file(fh, error_code);
00125 goto fn_exit;
00126 }
00127
00128 break;
00129 case MPI_SEEK_END:
00130
00131 ADIOI_Get_eof_offset(fh, &eof_offset);
00132 offset += eof_offset;
00133
00134 if (offset < 0)
00135 {
00136 error_code = MPIO_Err_create_code(MPI_SUCCESS,
00137 MPIR_ERR_RECOVERABLE,
00138 myname, __LINE__,
00139 MPI_ERR_ARG,
00140 "**ionegoffset", 0);
00141 error_code = MPIO_Err_return_file(fh, error_code);
00142 goto fn_exit;
00143 }
00144
00145 break;
00146 default:
00147
00148 error_code = MPIO_Err_create_code(MPI_SUCCESS,
00149 MPIR_ERR_RECOVERABLE,
00150 myname, __LINE__, MPI_ERR_ARG,
00151 "**iobadwhence", 0);
00152 error_code = MPIO_Err_return_file(fh, error_code);
00153 goto fn_exit;
00154
00155 }
00156
00157 ADIO_Set_shared_fp(fh, offset, &error_code);
00158
00159 if (error_code != MPI_SUCCESS)
00160 {
00161 error_code = MPIO_Err_create_code(MPI_SUCCESS,
00162 MPIR_ERR_FATAL,
00163 myname, __LINE__,
00164 MPI_ERR_INTERN,
00165 "**iosharedfailed", 0);
00166 error_code = MPIO_Err_return_file(fh, error_code);
00167 goto fn_exit;
00168 }
00169
00170
00171 }
00172
00173
00174 MPI_Barrier(fh->comm);
00175
00176 error_code = MPI_SUCCESS;
00177
00178 fn_exit:
00179 MPIU_THREAD_CS_EXIT(ALLFUNC,);
00180
00181 return error_code;
00182 }