00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "adio.h"
00010 #include "adio_extern.h"
00011 #ifdef PROFILE
00012 #include "mpe.h"
00013 #endif
00014
00015 #ifdef SX4
00016 #define lseek llseek
00017 #endif
00018
00019 #ifdef tflops
00020 #define lseek eseek
00021 #endif
00022
00023 #ifdef HAVE_UNISTD_H
00024 #include <unistd.h>
00025 #endif
00026
00027 ADIO_Offset ADIOI_GEN_SeekIndividual(ADIO_File fd, ADIO_Offset offset,
00028 int whence, int *error_code)
00029 {
00030
00031
00032
00033
00034
00035 #ifndef PRINT_ERR_MSG
00036 static char myname[] = "ADIOI_GEN_SEEKINDIVIDUAL";
00037 #endif
00038 ADIO_Offset off, err;
00039 ADIOI_Flatlist_node *flat_file;
00040
00041 int i, n_etypes_in_filetype, n_filetypes, etype_in_filetype;
00042 ADIO_Offset abs_off_in_filetype=0;
00043 int size_in_filetype, sum;
00044 int filetype_size, etype_size, filetype_is_contig;
00045 MPI_Aint filetype_extent;
00046
00047 ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig);
00048 etype_size = fd->etype_size;
00049
00050 if (filetype_is_contig) off = fd->disp + etype_size * offset;
00051 else {
00052 flat_file = ADIOI_Flatlist;
00053 while (flat_file->type != fd->filetype) flat_file = flat_file->next;
00054
00055 MPI_Type_extent(fd->filetype, &filetype_extent);
00056 MPI_Type_size(fd->filetype, &filetype_size);
00057 if ( ! filetype_size ) {
00058
00059
00060
00061 *error_code = MPI_SUCCESS;
00062 return 0;
00063 }
00064
00065 n_etypes_in_filetype = filetype_size/etype_size;
00066 n_filetypes = (int) (offset / n_etypes_in_filetype);
00067 etype_in_filetype = (int) (offset % n_etypes_in_filetype);
00068 size_in_filetype = etype_in_filetype * etype_size;
00069
00070 sum = 0;
00071 for (i=0; i<flat_file->count; i++) {
00072 sum += flat_file->blocklens[i];
00073 if (sum > size_in_filetype) {
00074 abs_off_in_filetype = flat_file->indices[i] +
00075 size_in_filetype - (sum - flat_file->blocklens[i]);
00076 break;
00077 }
00078 }
00079
00080
00081 off = fd->disp + (ADIO_Offset) n_filetypes * filetype_extent +
00082 abs_off_in_filetype;
00083 }
00084
00085 #ifdef PROFILE
00086 MPE_Log_event(11, 0, "start seek");
00087 #endif
00088 err = lseek(fd->fd_sys, off, SEEK_SET);
00089 #ifdef PROFILE
00090 MPE_Log_event(12, 0, "end seek");
00091 #endif
00092 fd->fp_ind = off;
00093 fd->fp_sys_posn = off;
00094
00095 #ifdef PRINT_ERR_MSG
00096 *error_code = (err == -1) ? MPI_ERR_UNKNOWN : MPI_SUCCESS;
00097 #else
00098 if (err == -1) {
00099 *error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,
00100 myname, "I/O Error", "%s", strerror(errno));
00101 ADIOI_Error(MPI_FILE_NULL, *error_code, myname);
00102 }
00103 else *error_code = MPI_SUCCESS;
00104 #endif
00105
00106 return off;
00107 }