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 }