00001
00002
00003
00004
00005
00006
00007
00008 #include "ad_panfs.h"
00009
00010 #ifdef HAVE_UNISTD_H
00011 #include <unistd.h>
00012 #endif
00013
00014 void ADIOI_PANFS_ReadContig(ADIO_File fd, void *buf, int count,
00015 MPI_Datatype datatype, int file_ptr_type,
00016 ADIO_Offset offset, ADIO_Status *status,
00017 int *error_code)
00018 {
00019 int err = -1, datatype_size, len;
00020 static char myname[] = "ADIOI_PANFS_READCONTIG";
00021
00022 MPI_Type_size(datatype, &datatype_size);
00023 len = datatype_size * count;
00024
00025 if (file_ptr_type == ADIO_INDIVIDUAL) {
00026 offset = fd->fp_ind;
00027 }
00028
00029 if (fd->fp_sys_posn != offset) {
00030 err = lseek(fd->fd_sys, offset, SEEK_SET);
00031
00032 if (err == -1) {
00033 *error_code = MPIO_Err_create_code(MPI_SUCCESS,
00034 MPIR_ERR_RECOVERABLE,
00035 myname, __LINE__,
00036 MPI_ERR_IO, "**io",
00037 "**io %s", strerror(errno));
00038 fd->fp_sys_posn = -1;
00039 return;
00040 }
00041
00042 }
00043
00044 AD_PANFS_RETRY(read(fd->fd_sys, buf, len),err)
00045
00046 if (err == -1) {
00047 *error_code = MPIO_Err_create_code(MPI_SUCCESS,
00048 MPIR_ERR_RECOVERABLE,
00049 myname, __LINE__,
00050 MPI_ERR_IO, "**io",
00051 "**io %s", strerror(errno));
00052 fd->fp_sys_posn = -1;
00053 return;
00054 }
00055
00056
00057 fd->fp_sys_posn = offset + err;
00058
00059 if (file_ptr_type == ADIO_INDIVIDUAL) {
00060 fd->fp_ind += err;
00061 }
00062
00063 #ifdef HAVE_STATUS_SET_BYTES
00064 if (err != -1) MPIR_Status_set_bytes(status, datatype, err);
00065 #endif
00066
00067 *error_code = MPI_SUCCESS;
00068 }