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 }