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 }