This source file includes following definitions.
- ADIOI_Get_eof_offset
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 #include "adio.h"
   9 #include "adio_extern.h"
  10 
  11 
  12 
  13 
  14 void ADIOI_Get_eof_offset(ADIO_File fd, ADIO_Offset *eof_offset)
  15 {
  16     MPI_Count filetype_size;
  17     int error_code, filetype_is_contig;
  18     ADIO_Offset fsize, disp, sum=0, size_in_file, n_filetypes, rem, etype_size;
  19     int flag, i;
  20     ADIO_Fcntl_t *fcntl_struct;
  21     MPI_Aint filetype_extent, lb;
  22     ADIOI_Flatlist_node *flat_file;
  23 
  24     
  25     fcntl_struct = (ADIO_Fcntl_t *) ADIOI_Malloc(sizeof(ADIO_Fcntl_t));
  26     ADIO_Fcntl(fd, ADIO_FCNTL_GET_FSIZE, fcntl_struct, &error_code);
  27     fsize = fcntl_struct->fsize;
  28     ADIOI_Free(fcntl_struct);
  29         
  30     
  31 
  32 
  33 
  34 
  35     ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig);
  36     etype_size = fd->etype_size;
  37 
  38     if (filetype_is_contig) 
  39         *eof_offset = (fsize - fd->disp + etype_size - 1)/etype_size;
  40     
  41     else {
  42         
  43         flat_file = ADIOI_Flatlist;
  44         while (flat_file->type != fd->filetype) 
  45             flat_file = flat_file->next;
  46         
  47         MPI_Type_size_x(fd->filetype, &filetype_size);
  48         MPI_Type_get_extent(fd->filetype, &lb, &filetype_extent);
  49 
  50         disp = fd->disp;
  51         n_filetypes = -1;
  52         flag = 0;
  53         while (!flag) {
  54             sum = 0;
  55             n_filetypes++;
  56             for (i=0; i<flat_file->count; i++) {
  57                 sum += flat_file->blocklens[i];
  58                 if (disp + flat_file->indices[i] + 
  59                     n_filetypes* ADIOI_AINT_CAST_TO_OFFSET filetype_extent + 
  60                        flat_file->blocklens[i] >= fsize) {
  61                     if (disp + flat_file->indices[i] + 
  62                            n_filetypes * ADIOI_AINT_CAST_TO_OFFSET filetype_extent >= fsize)
  63                         sum -= flat_file->blocklens[i];
  64                     else {
  65                         rem = (disp + flat_file->indices[i] + 
  66                                 n_filetypes* ADIOI_AINT_CAST_TO_OFFSET filetype_extent
  67                                 + flat_file->blocklens[i] - fsize);
  68                         sum -= rem;
  69                     }
  70                     flag = 1;
  71                     break;
  72                 }
  73             }
  74         }
  75         size_in_file = n_filetypes*(ADIO_Offset)filetype_size + sum;
  76         *eof_offset = (size_in_file+etype_size-1)/etype_size; 
  77     }
  78 }