This source file includes following definitions.
- ADIOI_ZOIDFS_ReadStrided
1
2
3
4
5
6
7
8 #include "adio.h"
9 #include "adio_extern.h"
10 #include "ad_zoidfs.h"
11
12 #include "ad_zoidfs_common.h"
13
14
15
16 void ADIOI_ZOIDFS_ReadStrided(ADIO_File fd, void *buf, int count,
17 MPI_Datatype datatype, int file_ptr_type,
18 ADIO_Offset offset, ADIO_Status *status, int
19 *error_code)
20 {
21
22 ADIOI_Flatlist_node *flat_buf, *flat_file;
23 int i, j, k, brd_size, frd_size=0, st_index=0;
24 int sum, n_etypes_in_filetype, size_in_filetype;
25 MPI_Count bufsize;
26 int n_filetypes, etype_in_filetype;
27 ADIO_Offset abs_off_in_filetype=0;
28 MPI_Count filetype_size, etype_size, buftype_size;
29 MPI_Aint filetype_extent, buftype_extent, filetype_lb, buftype_lb;
30 int buf_count, buftype_is_contig, filetype_is_contig;
31 ADIO_Offset off, disp, start_off, initial_off;
32 int flag, st_frd_size, st_n_filetypes;
33
34 size_t mem_list_count, file_list_count;
35 void ** mem_offsets;
36 uint64_t *file_offsets;
37 size_t *mem_lengths;
38 uint64_t *file_lengths;
39 int total_blks_to_read;
40
41 int max_mem_list, max_file_list;
42
43 int b_blks_read;
44 int f_data_read;
45 int size_read=0, n_read_lists, extra_blks;
46
47 int end_brd_size, end_frd_size;
48 int start_k, start_j, new_file_read, new_buffer_read;
49 int start_mem_offset;
50 ADIOI_ZOIDFS_object * zoidfs_obj_ptr;
51 int err_flag=0;
52 MPI_Offset total_bytes_read = 0;
53 static char myname[] = "ADIOI_ZOIDFS_ReadStrided";
54
55
56
57 #define MAX_ARRAY_SIZE 64
58
59 *error_code = MPI_SUCCESS;
60
61 ADIOI_Datatype_iscontig(datatype, &buftype_is_contig);
62 ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig);
63
64
65
66
67 if (!filetype_is_contig) {
68 flat_file = ADIOI_Flatlist;
69 while (flat_file->type != fd->filetype) flat_file = flat_file->next;
70 if (flat_file->count == 1 && !buftype_is_contig)
71 filetype_is_contig = 1;
72 }
73
74 MPI_Type_size_x(fd->filetype, &filetype_size);
75 if ( ! filetype_size ) {
76 #ifdef HAVE_STATUS_SET_BYTES
77 MPIR_Status_set_bytes(status, datatype, 0);
78 #endif
79 *error_code = MPI_SUCCESS;
80 return;
81 }
82
83 MPI_Type_get_extent(fd->filetype, &filetype_lb, &filetype_extent);
84 MPI_Type_size_x(datatype, &buftype_size);
85 MPI_Type_get_extent(datatype, &buftype_lb, &buftype_extent);
86 etype_size = fd->etype_size;
87
88 bufsize = buftype_size * count;
89
90 zoidfs_obj_ptr = (ADIOI_ZOIDFS_object *)fd->fs_ptr;
91
92 if (!buftype_is_contig && filetype_is_contig) {
93
94
95 uint64_t file_offsets;
96 uint64_t file_lengths;
97
98 flat_buf = ADIOI_Flatten_and_find(datatype);
99
100 off = (file_ptr_type == ADIO_INDIVIDUAL) ? fd->fp_ind :
101 fd->disp + etype_size * offset;
102
103 file_list_count = 1;
104 file_offsets = off;
105 file_lengths = 0;
106 total_blks_to_read = count*flat_buf->count;
107 b_blks_read = 0;
108
109
110 if (total_blks_to_read > MAX_ARRAY_SIZE)
111 mem_list_count = MAX_ARRAY_SIZE;
112 else mem_list_count = total_blks_to_read;
113 mem_offsets = (void*)ADIOI_Malloc(mem_list_count*sizeof(void*));
114 mem_lengths = (size_t*)ADIOI_Malloc(mem_list_count*sizeof(size_t));
115
116
117
118 j = 0;
119
120 while (b_blks_read < total_blks_to_read) {
121 for (i=0; i<flat_buf->count; i++) {
122 mem_offsets[b_blks_read % MAX_ARRAY_SIZE] =
123 buf + j*buftype_extent + flat_buf->indices[i];
124 mem_lengths[b_blks_read % MAX_ARRAY_SIZE] =
125 flat_buf->blocklens[i];
126 file_lengths += flat_buf->blocklens[i];
127 b_blks_read++;
128 if (!(b_blks_read % MAX_ARRAY_SIZE) ||
129 (b_blks_read == total_blks_to_read)) {
130
131
132
133 if (b_blks_read == total_blks_to_read) {
134 mem_list_count = total_blks_to_read % MAX_ARRAY_SIZE;
135
136 if (!mem_list_count) mem_list_count = MAX_ARRAY_SIZE;
137 }
138 #ifdef ADIOI_MPE_LOGGING
139 MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
140 #endif
141 NO_STALE(err_flag, fd, zoidfs_obj_ptr,
142 zoidfs_read(zoidfs_obj_ptr,
143 mem_list_count,
144 mem_offsets, mem_lengths,
145 1, &file_offsets, &file_lengths, ZOIDFS_NO_OP_HINT));
146 #ifdef ADIOI_MPE_LOGGING
147 MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
148 #endif
149
150 if (err_flag != ZFS_OK) {
151 *error_code = MPIO_Err_create_code(MPI_SUCCESS,
152 MPIR_ERR_RECOVERABLE,
153 myname, __LINE__,
154 ADIOI_ZOIDFS_error_convert(err_flag),
155 "Error in zoidfs_read", 0);
156 goto error_state;
157 }
158 total_bytes_read += file_lengths;
159
160
161
162
163 if (err_flag || b_blks_read == total_blks_to_read) break;
164
165 file_offsets += file_lengths;
166 file_lengths = 0;
167 }
168 }
169 j++;
170 }
171 ADIOI_Free(mem_offsets);
172 ADIOI_Free(mem_lengths);
173
174 if (file_ptr_type == ADIO_INDIVIDUAL)
175 fd->fp_ind += total_bytes_read;
176
177 fd->fp_sys_posn = -1;
178
179 #ifdef HAVE_STATUS_SET_BYTES
180 MPIR_Status_set_bytes(status, datatype, bufsize);
181
182
183
184 #endif
185 ADIOI_Delete_flattened(datatype);
186
187 return;
188 }
189
190
191
192
193
194 flat_file = ADIOI_Flatlist;
195 while (flat_file->type != fd->filetype) flat_file = flat_file->next;
196
197 disp = fd->disp;
198 initial_off = offset;
199
200
201
202
203
204
205
206 if (file_ptr_type == ADIO_INDIVIDUAL) {
207 offset = fd->fp_ind;
208 n_filetypes = -1;
209 flag = 0;
210 while (!flag) {
211 n_filetypes++;
212 for (i=0; i<flat_file->count; i++) {
213 if (disp + flat_file->indices[i] +
214 ((ADIO_Offset) n_filetypes)*filetype_extent +
215 flat_file->blocklens[i] >= offset) {
216 st_index = i;
217 frd_size = disp + flat_file->indices[i] +
218 ((ADIO_Offset) n_filetypes)*filetype_extent
219 + flat_file->blocklens[i] - offset;
220 flag = 1;
221 break;
222 }
223 }
224 }
225 }
226 else {
227 n_etypes_in_filetype = filetype_size/etype_size;
228 n_filetypes = (int) (offset / n_etypes_in_filetype);
229 etype_in_filetype = (int) (offset % n_etypes_in_filetype);
230 size_in_filetype = etype_in_filetype * etype_size;
231
232 sum = 0;
233 for (i=0; i<flat_file->count; i++) {
234 sum += flat_file->blocklens[i];
235 if (sum > size_in_filetype) {
236 st_index = i;
237 frd_size = sum - size_in_filetype;
238 abs_off_in_filetype = flat_file->indices[i] +
239 size_in_filetype - (sum - flat_file->blocklens[i]);
240 break;
241 }
242 }
243
244
245 offset = disp + ((ADIO_Offset) n_filetypes)*filetype_extent +
246 abs_off_in_filetype;
247 }
248
249 start_off = offset;
250 st_frd_size = frd_size;
251 st_n_filetypes = n_filetypes;
252
253 if (buftype_is_contig && !filetype_is_contig) {
254
255
256
257
258
259 size_t mem_lengths;
260 size_t mem_offsets;
261
262 i = 0;
263 j = st_index;
264 n_filetypes = st_n_filetypes;
265
266 mem_list_count = 1;
267
268
269 f_data_read = ADIOI_MIN(st_frd_size, bufsize);
270 total_blks_to_read = 1;
271 if (j < (flat_file->count-1)) j++;
272 else {
273 j = 0;
274 n_filetypes++;
275 }
276 while (f_data_read < bufsize) {
277 f_data_read += flat_file->blocklens[j];
278 total_blks_to_read++;
279 if (j<(flat_file->count-1)) j++;
280 else j = 0;
281 }
282
283 j = st_index;
284 n_filetypes = st_n_filetypes;
285 n_read_lists = total_blks_to_read/MAX_ARRAY_SIZE;
286 extra_blks = total_blks_to_read%MAX_ARRAY_SIZE;
287
288 mem_offsets = (size_t)buf;
289 mem_lengths = 0;
290
291
292
293 if (n_read_lists) {
294 file_offsets = (int64_t*)ADIOI_Malloc(MAX_ARRAY_SIZE*
295 sizeof(int64_t));
296 file_lengths = (uint64_t*)ADIOI_Malloc(MAX_ARRAY_SIZE*
297 sizeof(uint64_t));
298 }
299
300
301 else {
302 file_offsets = (int64_t*)ADIOI_Malloc(extra_blks*
303 sizeof(int64_t));
304 file_lengths = (uint64_t*)ADIOI_Malloc(extra_blks*
305 sizeof(uint64_t));
306 }
307
308
309 for (i=0; i<n_read_lists; i++) {
310 file_list_count = MAX_ARRAY_SIZE;
311 if(!i) {
312 file_offsets[0] = offset;
313 file_lengths[0] = st_frd_size;
314 mem_lengths = st_frd_size;
315 }
316 for (k=0; k<MAX_ARRAY_SIZE; k++) {
317 if (i || k) {
318 file_offsets[k] = disp +
319 ((ADIO_Offset)n_filetypes)*filetype_extent
320 + flat_file->indices[j];
321 file_lengths[k] = flat_file->blocklens[j];
322 mem_lengths += file_lengths[k];
323 }
324 if (j<(flat_file->count - 1)) j++;
325 else {
326 j = 0;
327 n_filetypes++;
328 }
329 }
330
331 #ifdef ADIOI_MPE_LOGGING
332 MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
333 #endif
334 NO_STALE(err_flag, fd, zoidfs_obj_ptr,
335 zoidfs_read(zoidfs_obj_ptr,
336 1, buf, &mem_lengths,
337 file_list_count,
338 file_offsets, file_lengths, ZOIDFS_NO_OP_HINT));
339 #ifdef ADIOI_MPE_LOGGING
340 MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
341 #endif
342
343 if (err_flag != ZFS_OK) {
344 *error_code = MPIO_Err_create_code(MPI_SUCCESS,
345 MPIR_ERR_RECOVERABLE,
346 myname, __LINE__,
347 ADIOI_ZOIDFS_error_convert(err_flag),
348 "Error in zoidfs_read", 0);
349 goto error_state;
350 }
351
352 total_bytes_read += mem_lengths;
353
354 mem_offsets += mem_lengths;
355 mem_lengths = 0;
356 }
357
358
359 if (extra_blks) {
360 file_list_count = extra_blks;
361 if(!i) {
362 file_offsets[0] = offset;
363 file_lengths[0] = ADIOI_MIN(st_frd_size, bufsize);
364 }
365 for (k=0; k<extra_blks; k++) {
366 if(i || k) {
367 file_offsets[k] = disp +
368 ((ADIO_Offset)n_filetypes)*filetype_extent +
369 flat_file->indices[j];
370 if (k == (extra_blks - 1)) {
371 file_lengths[k] = bufsize - mem_lengths
372 - mem_offsets + (size_t)buf;
373 }
374 else file_lengths[k] = flat_file->blocklens[j];
375 }
376 mem_lengths += file_lengths[k];
377 if (j<(flat_file->count - 1)) j++;
378 else {
379 j = 0;
380 n_filetypes++;
381 }
382 }
383 #ifdef ADIOI_MPE_LOGGING
384 MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
385 #endif
386 NO_STALE(err_flag, fd, zoidfs_obj_ptr,
387 zoidfs_read(zoidfs_obj_ptr, 1,
388 (void **)&mem_offsets,
389 &mem_lengths,
390 file_list_count,
391 file_offsets, file_lengths, ZOIDFS_NO_OP_HINT));
392 #ifdef ADIOI_MPE_LOGGING
393 MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
394 #endif
395
396 if (err_flag != 0) {
397 *error_code = MPIO_Err_create_code(MPI_SUCCESS,
398 MPIR_ERR_RECOVERABLE,
399 myname, __LINE__,
400 ADIOI_ZOIDFS_error_convert(err_flag),
401 "Error in zoidfs_read", 0);
402 goto error_state;
403 }
404
405 total_bytes_read += mem_lengths;
406 }
407 }
408 else {
409
410
411 flat_buf = ADIOI_Flatten_and_find(datatype);
412
413 size_read = 0;
414 n_filetypes = st_n_filetypes;
415 frd_size = st_frd_size;
416 brd_size = flat_buf->blocklens[0];
417 buf_count = 0;
418 start_mem_offset = 0;
419 start_k = k = 0;
420 start_j = st_index;
421 max_mem_list = 0;
422 max_file_list = 0;
423
424
425
426
427
428 while (size_read < bufsize) {
429 k = start_k;
430 new_buffer_read = 0;
431 mem_list_count = 0;
432 while ((mem_list_count < MAX_ARRAY_SIZE) &&
433 (new_buffer_read < bufsize-size_read)) {
434
435
436
437
438
439 if(mem_list_count) {
440 if((new_buffer_read + flat_buf->blocklens[k] +
441 size_read) > bufsize) {
442 end_brd_size = new_buffer_read +
443 flat_buf->blocklens[k] - (bufsize - size_read);
444 new_buffer_read = bufsize - size_read;
445 }
446 else {
447 new_buffer_read += flat_buf->blocklens[k];
448 end_brd_size = flat_buf->blocklens[k];
449 }
450 }
451 else {
452 if (brd_size > (bufsize - size_read)) {
453 new_buffer_read = bufsize - size_read;
454 brd_size = new_buffer_read;
455 }
456 else new_buffer_read = brd_size;
457 }
458 mem_list_count++;
459 k = (k + 1)%flat_buf->count;
460 }
461
462 j = start_j;
463 new_file_read = 0;
464 file_list_count = 0;
465 while ((file_list_count < MAX_ARRAY_SIZE) &&
466 (new_file_read < new_buffer_read)) {
467 if(file_list_count) {
468 if((new_file_read + flat_file->blocklens[j]) >
469 new_buffer_read) {
470 end_frd_size = new_buffer_read - new_file_read;
471 new_file_read = new_buffer_read;
472 j--;
473 }
474 else {
475 new_file_read += flat_file->blocklens[j];
476 end_frd_size = flat_file->blocklens[j];
477 }
478 }
479 else {
480 if (frd_size > new_buffer_read) {
481 new_file_read = new_buffer_read;
482 frd_size = new_file_read;
483 }
484 else new_file_read = frd_size;
485 }
486 file_list_count++;
487 if (j < (flat_file->count - 1)) j++;
488 else j = 0;
489
490 k = start_k;
491 if ((new_file_read < new_buffer_read) &&
492 (file_list_count == MAX_ARRAY_SIZE)) {
493 new_buffer_read = 0;
494 mem_list_count = 0;
495 while (new_buffer_read < new_file_read) {
496 if(mem_list_count) {
497 if((new_buffer_read + flat_buf->blocklens[k]) >
498 new_file_read) {
499 end_brd_size = new_file_read - new_buffer_read;
500 new_buffer_read = new_file_read;
501 k--;
502 }
503 else {
504 new_buffer_read += flat_buf->blocklens[k];
505 end_brd_size = flat_buf->blocklens[k];
506 }
507 }
508 else {
509 new_buffer_read = brd_size;
510 if (brd_size > (bufsize - size_read)) {
511 new_buffer_read = bufsize - size_read;
512 brd_size = new_buffer_read;
513 }
514 }
515 mem_list_count++;
516 k = (k + 1)%flat_buf->count;
517 }
518 }
519
520 }
521
522
523
524 k = start_k;
525 j = start_j;
526 for (i=0; i<mem_list_count; i++) {
527 if(i) {
528 if (i == (mem_list_count - 1)) {
529 if (flat_buf->blocklens[k] == end_brd_size)
530 brd_size = flat_buf->blocklens[(k+1)%
531 flat_buf->count];
532 else {
533 brd_size = flat_buf->blocklens[k] - end_brd_size;
534 k--;
535 buf_count--;
536 }
537 }
538 }
539 buf_count++;
540 k = (k + 1)%flat_buf->count;
541 }
542 for (i=0; i<file_list_count; i++) {
543 if (i) {
544 if (i == (file_list_count - 1)) {
545 if (flat_file->blocklens[j] == end_frd_size)
546 frd_size = flat_file->blocklens[(j+1)%
547 flat_file->count];
548 else {
549 frd_size = flat_file->blocklens[j] - end_frd_size;
550 j--;
551 }
552 }
553 }
554 if (j < flat_file->count - 1) j++;
555 else {
556 j = 0;
557 n_filetypes++;
558 }
559 }
560 size_read += new_buffer_read;
561 start_k = k;
562 start_j = j;
563 if (max_mem_list < mem_list_count)
564 max_mem_list = mem_list_count;
565 if (max_file_list < file_list_count)
566 max_file_list = file_list_count;
567 }
568
569
570
571
572
573
574
575
576
577
578
579
580 if ( ( (file_list_count == 1) &&
581 (new_file_read < flat_file->blocklens[0] ) ) ||
582 ((mem_list_count == 1) &&
583 (new_buffer_read < flat_buf->blocklens[0]) ) ||
584 ((file_list_count == MAX_ARRAY_SIZE) &&
585 (new_file_read < flat_buf->blocklens[0]) ) ||
586 ( (mem_list_count == MAX_ARRAY_SIZE) &&
587 (new_buffer_read < flat_file->blocklens[0])) )
588 {
589
590 ADIOI_Delete_flattened(datatype);
591 ADIOI_GEN_ReadStrided_naive(fd, buf, count, datatype,
592 file_ptr_type, initial_off, status, error_code);
593 return;
594 }
595
596 mem_offsets = (void *)ADIOI_Malloc(max_mem_list*sizeof(void *));
597 mem_lengths = (size_t*)ADIOI_Malloc(max_mem_list*sizeof(size_t));
598 file_offsets = (uint64_t *)ADIOI_Malloc(max_file_list*sizeof(uint64_t));
599 file_lengths = (uint64_t *)ADIOI_Malloc(max_file_list*sizeof(uint64_t));
600
601 size_read = 0;
602 n_filetypes = st_n_filetypes;
603 frd_size = st_frd_size;
604 brd_size = flat_buf->blocklens[0];
605 buf_count = 0;
606 start_mem_offset = 0;
607 start_k = k = 0;
608 start_j = st_index;
609
610
611
612
613
614 while (size_read < bufsize) {
615 k = start_k;
616 new_buffer_read = 0;
617 mem_list_count = 0;
618 while ((mem_list_count < MAX_ARRAY_SIZE) &&
619 (new_buffer_read < bufsize-size_read)) {
620
621
622
623
624
625 if(mem_list_count) {
626 if((new_buffer_read + flat_buf->blocklens[k] +
627 size_read) > bufsize) {
628 end_brd_size = new_buffer_read +
629 flat_buf->blocklens[k] - (bufsize - size_read);
630 new_buffer_read = bufsize - size_read;
631 }
632 else {
633 new_buffer_read += flat_buf->blocklens[k];
634 end_brd_size = flat_buf->blocklens[k];
635 }
636 }
637 else {
638 if (brd_size > (bufsize - size_read)) {
639 new_buffer_read = bufsize - size_read;
640 brd_size = new_buffer_read;
641 }
642 else new_buffer_read = brd_size;
643 }
644 mem_list_count++;
645 k = (k + 1)%flat_buf->count;
646 }
647
648 j = start_j;
649 new_file_read = 0;
650 file_list_count = 0;
651 while ((file_list_count < MAX_ARRAY_SIZE) &&
652 (new_file_read < new_buffer_read)) {
653 if(file_list_count) {
654 if((new_file_read + flat_file->blocklens[j]) >
655 new_buffer_read) {
656 end_frd_size = new_buffer_read - new_file_read;
657 new_file_read = new_buffer_read;
658 j--;
659 }
660 else {
661 new_file_read += flat_file->blocklens[j];
662 end_frd_size = flat_file->blocklens[j];
663 }
664 }
665 else {
666 if (frd_size > new_buffer_read) {
667 new_file_read = new_buffer_read;
668 frd_size = new_file_read;
669 }
670 else new_file_read = frd_size;
671 }
672 file_list_count++;
673 if (j < (flat_file->count - 1)) j++;
674 else j = 0;
675
676 k = start_k;
677 if ((new_file_read < new_buffer_read) &&
678 (file_list_count == MAX_ARRAY_SIZE)) {
679 new_buffer_read = 0;
680 mem_list_count = 0;
681 while (new_buffer_read < new_file_read) {
682 if(mem_list_count) {
683 if((new_buffer_read + flat_buf->blocklens[k]) >
684 new_file_read) {
685 end_brd_size = new_file_read - new_buffer_read;
686 new_buffer_read = new_file_read;
687 k--;
688 }
689 else {
690 new_buffer_read += flat_buf->blocklens[k];
691 end_brd_size = flat_buf->blocklens[k];
692 }
693 }
694 else {
695 new_buffer_read = brd_size;
696 if (brd_size > (bufsize - size_read)) {
697 new_buffer_read = bufsize - size_read;
698 brd_size = new_buffer_read;
699 }
700 }
701 mem_list_count++;
702 k = (k + 1)%flat_buf->count;
703 }
704 }
705
706 }
707
708
709
710 k = start_k;
711 j = start_j;
712 for (i=0; i<mem_list_count; i++) {
713 mem_offsets[i] = buf +
714 buftype_extent* (buf_count/flat_buf->count) +
715 flat_buf->indices[k];
716 if(!i) {
717 mem_lengths[0] = brd_size;
718 mem_offsets[0] += flat_buf->blocklens[k] - brd_size;
719 }
720 else {
721 if (i == (mem_list_count - 1)) {
722 mem_lengths[i] = end_brd_size;
723 if (flat_buf->blocklens[k] == end_brd_size)
724 brd_size = flat_buf->blocklens[(k+1)%
725 flat_buf->count];
726 else {
727 brd_size = flat_buf->blocklens[k] - end_brd_size;
728 k--;
729 buf_count--;
730 }
731 }
732 else {
733 mem_lengths[i] = flat_buf->blocklens[k];
734 }
735 }
736 buf_count++;
737 k = (k + 1)%flat_buf->count;
738 }
739 for (i=0; i<file_list_count; i++) {
740 file_offsets[i] = disp + flat_file->indices[j] +
741 ((ADIO_Offset)n_filetypes) * filetype_extent;
742 if (!i) {
743 file_lengths[0] = frd_size;
744 file_offsets[0] += flat_file->blocklens[j] - frd_size;
745 }
746 else {
747 if (i == (file_list_count - 1)) {
748 file_lengths[i] = end_frd_size;
749 if (flat_file->blocklens[j] == end_frd_size)
750 frd_size = flat_file->blocklens[(j+1)%
751 flat_file->count];
752 else {
753 frd_size = flat_file->blocklens[j] - end_frd_size;
754 j--;
755 }
756 }
757 else file_lengths[i] = flat_file->blocklens[j];
758 }
759 if (j < flat_file->count - 1) j++;
760 else {
761 j = 0;
762 n_filetypes++;
763 }
764 }
765
766 #ifdef ADIOI_MPE_LOGGING
767 MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
768 #endif
769 NO_STALE(err_flag, fd, zoidfs_obj_ptr,
770 zoidfs_read(zoidfs_obj_ptr,
771 mem_list_count, mem_offsets, mem_lengths,
772 file_list_count,
773 file_offsets, file_lengths, ZOIDFS_NO_OP_HINT));
774 #ifdef ADIOI_MPE_LOGGING
775 MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
776 #endif
777
778 if (err_flag != ZFS_OK) {
779 *error_code = MPIO_Err_create_code(MPI_SUCCESS,
780 MPIR_ERR_RECOVERABLE,
781 myname, __LINE__,
782 ADIOI_ZOIDFS_error_convert(err_flag),
783 "Error in zoidfs_read", 0);
784 }
785
786 size_read += new_buffer_read;
787 total_bytes_read += new_buffer_read;
788 start_k = k;
789 start_j = j;
790 }
791 ADIOI_Free(mem_offsets);
792 ADIOI_Free(mem_lengths);
793 }
794
795
796
797
798
799
800
801
802
803
804 if (file_ptr_type == ADIO_INDIVIDUAL) {
805 fd->fp_ind = file_offsets[file_list_count-1]+
806 file_lengths[file_list_count-1];
807 }
808
809 ADIOI_Free(file_offsets);
810 ADIOI_Free(file_lengths);
811
812 if (err_flag == 0) *error_code = MPI_SUCCESS;
813
814 error_state:
815 fd->fp_sys_posn = -1;
816
817 #ifdef HAVE_STATUS_SET_BYTES
818 MPIR_Status_set_bytes(status, datatype, bufsize);
819
820
821
822 #endif
823
824 if (!buftype_is_contig) ADIOI_Delete_flattened(datatype);
825 }
826