00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "ad_nfs.h"
00010
00011 void ADIOI_NFS_IreadContig(ADIO_File fd, void *buf, int count,
00012 MPI_Datatype datatype, int file_ptr_type,
00013 ADIO_Offset offset, ADIO_Request *request, int *error_code)
00014 {
00015 int len, typesize;
00016 #ifdef NO_AIO
00017 ADIO_Status status;
00018 #else
00019 int err=-1;
00020 #ifndef PRINT_ERR_MSG
00021 static char myname[] = "ADIOI_NFS_IREADCONTIG";
00022 #endif
00023 #endif
00024
00025 (*request) = ADIOI_Malloc_request();
00026 (*request)->optype = ADIOI_READ;
00027 (*request)->fd = fd;
00028 (*request)->datatype = datatype;
00029
00030 MPI_Type_size(datatype, &typesize);
00031 len = count * typesize;
00032
00033 #ifdef NO_AIO
00034
00035
00036
00037 ADIOI_NFS_ReadContig(fd, buf, len, MPI_BYTE, file_ptr_type, offset,
00038 &status, error_code);
00039 (*request)->queued = 0;
00040 #ifdef HAVE_STATUS_SET_BYTES
00041 if (*error_code == MPI_SUCCESS) {
00042 MPI_Get_elements(&status, MPI_BYTE, &len);
00043 (*request)->nbytes = len;
00044 }
00045 #endif
00046
00047 #else
00048 if (file_ptr_type == ADIO_INDIVIDUAL) offset = fd->fp_ind;
00049 err = ADIOI_NFS_aio(fd, buf, len, offset, 0, &((*request)->handle));
00050 if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind += len;
00051
00052 (*request)->queued = 1;
00053 ADIOI_Add_req_to_list(request);
00054
00055 #ifdef PRINT_ERR_MSG
00056 *error_code = (err == -1) ? MPI_ERR_UNKNOWN : MPI_SUCCESS;
00057 #else
00058 if (err == -1) {
00059 *error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,
00060 myname, "I/O Error", "%s", strerror(errno));
00061 ADIOI_Error(fd, *error_code, myname);
00062 }
00063 else *error_code = MPI_SUCCESS;
00064 #endif
00065 #endif
00066
00067 fd->fp_sys_posn = -1;
00068 fd->async_count++;
00069 }
00070
00071
00072
00073 void ADIOI_NFS_IreadStrided(ADIO_File fd, void *buf, int count,
00074 MPI_Datatype datatype, int file_ptr_type,
00075 ADIO_Offset offset, ADIO_Request *request, int
00076 *error_code)
00077 {
00078 ADIO_Status status;
00079 #ifdef HAVE_STATUS_SET_BYTES
00080 int typesize;
00081 #endif
00082
00083 *request = ADIOI_Malloc_request();
00084 (*request)->optype = ADIOI_READ;
00085 (*request)->fd = fd;
00086 (*request)->datatype = datatype;
00087 (*request)->queued = 0;
00088 (*request)->handle = 0;
00089
00090
00091 ADIOI_NFS_ReadStrided(fd, buf, count, datatype, file_ptr_type,
00092 offset, &status, error_code);
00093
00094 fd->async_count++;
00095
00096 #ifdef HAVE_STATUS_SET_BYTES
00097 if (*error_code == MPI_SUCCESS) {
00098 MPI_Type_size(datatype, &typesize);
00099 (*request)->nbytes = count * typesize;
00100 }
00101 #endif
00102 }