00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "ad_xfs.h"
00010
00011 static void ADIOI_XFS_Aligned_Mem_File_Read(ADIO_File fd, void *buf, int len,
00012 ADIO_Offset offset, int *err);
00013
00014 void ADIOI_XFS_ReadContig(ADIO_File fd, void *buf, int count,
00015 MPI_Datatype datatype, int file_ptr_type,
00016 ADIO_Offset offset, ADIO_Status *status, int *error_code)
00017 {
00018 int err=-1, datatype_size, len, diff, size, nbytes;
00019 void *newbuf;
00020 #ifndef PRINT_ERR_MSG
00021 static char myname[] = "ADIOI_XFS_READCONTIG";
00022 #endif
00023
00024 MPI_Type_size(datatype, &datatype_size);
00025 len = datatype_size * count;
00026
00027 fd->fp_sys_posn = -1;
00028
00029 if (file_ptr_type == ADIO_INDIVIDUAL) offset = fd->fp_ind;
00030
00031 if (!(fd->direct_read))
00032 err = pread(fd->fd_sys, buf, len, offset);
00033 else {
00034
00035
00036
00037
00038
00039 if (!(((long) buf) % fd->d_mem) && !(offset % fd->d_miniosz))
00040 ADIOI_XFS_Aligned_Mem_File_Read(fd, buf, len, offset, &err);
00041
00042
00043
00044
00045
00046 else if (offset % fd->d_miniosz) {
00047 diff = fd->d_miniosz - (offset % fd->d_miniosz);
00048 diff = ADIOI_MIN(diff, len);
00049 nbytes = pread(fd->fd_sys, buf, diff, offset);
00050
00051 buf = ((char *) buf) + diff;
00052 offset += diff;
00053 size = len - diff;
00054 if (!(((long) buf) % fd->d_mem)) {
00055 ADIOI_XFS_Aligned_Mem_File_Read(fd, buf, size, offset, &err);
00056 nbytes += err;
00057 }
00058 else {
00059 newbuf = (void *) memalign(XFS_MEMALIGN, size);
00060 if (newbuf) {
00061 ADIOI_XFS_Aligned_Mem_File_Read(fd, newbuf, size, offset, &err);
00062 if (err > 0) memcpy(buf, newbuf, err);
00063 nbytes += err;
00064 free(newbuf);
00065 }
00066 else nbytes += pread(fd->fd_sys, buf, size, offset);
00067 }
00068 err = nbytes;
00069 }
00070
00071
00072
00073 else {
00074 newbuf = (void *) memalign(XFS_MEMALIGN, len);
00075 if (newbuf) {
00076 ADIOI_XFS_Aligned_Mem_File_Read(fd, newbuf, len, offset, &err);
00077 if (err > 0) memcpy(buf, newbuf, err);
00078 free(newbuf);
00079 }
00080 else err = pread(fd->fd_sys, buf, len, offset);
00081 }
00082 }
00083
00084 if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind += err;
00085
00086 #ifdef HAVE_STATUS_SET_BYTES
00087 if (err != -1) MPIR_Status_set_bytes(status, datatype, err);
00088 #endif
00089
00090 #ifdef PRINT_ERR_MSG
00091 *error_code = (err == -1) ? MPI_ERR_UNKNOWN : MPI_SUCCESS;
00092 #else
00093 if (err == -1) {
00094 *error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,
00095 myname, "I/O Error", "%s", strerror(errno));
00096 ADIOI_Error(fd, *error_code, myname);
00097 }
00098 else *error_code = MPI_SUCCESS;
00099 #endif
00100 }
00101
00102
00103 void ADIOI_XFS_Aligned_Mem_File_Read(ADIO_File fd, void *buf, int len,
00104 ADIO_Offset offset, int *err)
00105 {
00106 int ntimes, rem, newrem, i, size, nbytes;
00107
00108
00109
00110
00111
00112
00113 if (!(len % fd->d_miniosz) &&
00114 (len >= fd->d_miniosz) && (len <= fd->d_maxiosz))
00115 *err = pread(fd->fd_direct, buf, len, offset);
00116 else if (len < fd->d_miniosz)
00117 *err = pread(fd->fd_sys, buf, len, offset);
00118 else if (len > fd->d_maxiosz) {
00119 ntimes = len/(fd->d_maxiosz);
00120 rem = len - ntimes * fd->d_maxiosz;
00121 nbytes = 0;
00122 for (i=0; i<ntimes; i++) {
00123 nbytes += pread(fd->fd_direct, ((char *)buf) + i * fd->d_maxiosz,
00124 fd->d_maxiosz, offset);
00125 offset += fd->d_maxiosz;
00126 }
00127 if (rem) {
00128 if (!(rem % fd->d_miniosz))
00129 nbytes += pread(fd->fd_direct,
00130 ((char *)buf) + ntimes * fd->d_maxiosz, rem, offset);
00131 else {
00132 newrem = rem % fd->d_miniosz;
00133 size = rem - newrem;
00134 if (size) {
00135 nbytes += pread(fd->fd_direct,
00136 ((char *)buf) + ntimes * fd->d_maxiosz, size, offset);
00137 offset += size;
00138 }
00139 nbytes += pread(fd->fd_sys,
00140 ((char *)buf) + ntimes*fd->d_maxiosz + size, newrem, offset);
00141 }
00142 }
00143 *err = nbytes;
00144 }
00145 else {
00146 rem = len % fd->d_miniosz;
00147 size = len - rem;
00148 nbytes = pread(fd->fd_direct, buf, size, offset);
00149 nbytes += pread(fd->fd_sys, (char *)buf + size, rem, offset+size);
00150 *err = nbytes;
00151 }
00152 }
00153
00154
00155 void ADIOI_XFS_ReadStrided(ADIO_File fd, void *buf, int count,
00156 MPI_Datatype datatype, int file_ptr_type,
00157 ADIO_Offset offset, ADIO_Status *status, int
00158 *error_code)
00159 {
00160 ADIOI_GEN_ReadStrided(fd, buf, count, datatype, file_ptr_type,
00161 offset, status, error_code);
00162 }