This source file includes following definitions.
- ADIOI_GEN_SeekIndividual
   1 
   2 
   3 
   4 
   5 
   6 
   7 #include "adio.h"
   8 #include "adio_extern.h"
   9 
  10 #ifdef HAVE_UNISTD_H
  11 #include <unistd.h>
  12 #endif
  13 
  14 ADIO_Offset ADIOI_GEN_SeekIndividual(ADIO_File fd, ADIO_Offset offset, 
  15                                      int whence, int *error_code)
  16 {
  17 
  18 
  19 
  20 
  21 
  22     ADIO_Offset off;
  23     ADIOI_Flatlist_node *flat_file;
  24 
  25     int i;
  26     ADIO_Offset n_etypes_in_filetype, n_filetypes, etype_in_filetype;
  27     ADIO_Offset abs_off_in_filetype=0;
  28     ADIO_Offset size_in_filetype, sum;
  29     MPI_Count filetype_size, etype_size;
  30     int filetype_is_contig;
  31     MPI_Aint filetype_extent, lb;
  32 
  33     ADIOI_UNREFERENCED_ARG(whence);
  34 
  35     ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig);
  36     etype_size = fd->etype_size;
  37 
  38     if (filetype_is_contig) off = fd->disp + etype_size * offset;
  39     else {
  40         flat_file = ADIOI_Flatlist;
  41         while (flat_file->type != fd->filetype) flat_file = flat_file->next;
  42 
  43         MPI_Type_get_extent(fd->filetype, &lb, &filetype_extent);
  44         MPI_Type_size_x(fd->filetype, &filetype_size);
  45         if ( ! filetype_size ) {
  46             
  47 
  48 
  49             *error_code = MPI_SUCCESS; 
  50             return 0;
  51         }
  52 
  53         n_etypes_in_filetype = filetype_size/etype_size;
  54         n_filetypes = offset / n_etypes_in_filetype;
  55         etype_in_filetype = offset % n_etypes_in_filetype;
  56         size_in_filetype = etype_in_filetype * etype_size;
  57  
  58         sum = 0;
  59         for (i=0; i<flat_file->count; i++) {
  60             sum += flat_file->blocklens[i];
  61             if (sum > size_in_filetype) {
  62                 abs_off_in_filetype = flat_file->indices[i] +
  63                     size_in_filetype - (sum - flat_file->blocklens[i]);
  64                 break;
  65             }
  66         }
  67 
  68         
  69         off = fd->disp + n_filetypes * filetype_extent +
  70                 abs_off_in_filetype;
  71     }
  72 
  73 
  74 
  75 
  76 
  77 
  78 
  79 
  80 
  81     fd->fp_ind = off;
  82 
  83     *error_code = MPI_SUCCESS;
  84 
  85     return off;
  86 }