AMPI #952: update ROMIO to MPICH2-1.4.1p1
[charm.git] / src / libs / ck-libs / ampi / romio / adio / common / ad_read.c
blobf5549fc63de93bfdcb2cbe66a552c00573cb45a2
1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
2 /*
4 * Copyright (C) 1997 University of Chicago.
5 * See COPYRIGHT notice in top-level directory.
6 */
8 #include "adio.h"
10 #ifdef HAVE_UNISTD_H
11 #include <unistd.h>
12 #endif
13 #ifdef AGGREGATION_PROFILE
14 #include "mpe.h"
15 #endif
17 void ADIOI_GEN_ReadContig(ADIO_File fd, void *buf, int count,
18 MPI_Datatype datatype, int file_ptr_type,
19 ADIO_Offset offset, ADIO_Status *status,
20 int *error_code)
22 int err = -1, datatype_size;
23 ADIO_Offset len;
24 static char myname[] = "ADIOI_GEN_READCONTIG";
26 #ifdef AGGREGATION_PROFILE
27 MPE_Log_event (5034, 0, NULL);
28 #endif
29 MPI_Type_size(datatype, &datatype_size);
30 len = (ADIO_Offset)datatype_size * (ADIO_Offset)count;
31 ADIOI_Assert(len == (unsigned int) len); /* read takes an unsigned int parm */
33 if (file_ptr_type == ADIO_INDIVIDUAL) {
34 offset = fd->fp_ind;
37 if (fd->fp_sys_posn != offset) {
38 #ifdef ADIOI_MPE_LOGGING
39 MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
40 #endif
41 err = lseek(fd->fd_sys, offset, SEEK_SET);
42 #ifdef ADIOI_MPE_LOGGING
43 MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
44 #endif
45 /* --BEGIN ERROR HANDLING-- */
46 if (err == -1) {
47 *error_code = MPIO_Err_create_code(MPI_SUCCESS,
48 MPIR_ERR_RECOVERABLE,
49 myname, __LINE__,
50 MPI_ERR_IO, "**io",
51 "**io %s", strerror(errno));
52 fd->fp_sys_posn = -1;
53 return;
55 /* --END ERROR HANDLING-- */
58 #ifdef ADIOI_MPE_LOGGING
59 MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
60 #endif
61 err = read(fd->fd_sys, buf, (unsigned int)len);
62 #ifdef ADIOI_MPE_LOGGING
63 MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
64 #endif
65 /* --BEGIN ERROR HANDLING-- */
66 if (err == -1) {
67 *error_code = MPIO_Err_create_code(MPI_SUCCESS,
68 MPIR_ERR_RECOVERABLE,
69 myname, __LINE__,
70 MPI_ERR_IO, "**io",
71 "**io %s", strerror(errno));
72 fd->fp_sys_posn = -1;
73 return;
75 /* --END ERROR HANDLING-- */
77 fd->fp_sys_posn = offset + err;
79 if (file_ptr_type == ADIO_INDIVIDUAL) {
80 fd->fp_ind += err;
83 #ifdef HAVE_STATUS_SET_BYTES
84 if (err != -1) MPIR_Status_set_bytes(status, datatype, err);
85 #endif
87 *error_code = MPI_SUCCESS;
88 #ifdef AGGREGATION_PROFILE
89 MPE_Log_event (5035, 0, NULL);
90 #endif