00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "ad_pfs.h"
00010
00011 void ADIOI_PFS_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 long *id_sys;
00016 int len, typesize, err=-1;
00017 ADIO_Offset off;
00018 #ifndef PRINT_ERR_MSG
00019 static char myname[] = "ADIOI_PFS_IREADCONTIG";
00020 #endif
00021
00022 *request = ADIOI_Malloc_request();
00023 (*request)->optype = ADIOI_READ;
00024 (*request)->fd = fd;
00025 (*request)->datatype = datatype;
00026
00027 MPI_Type_size(datatype, &typesize);
00028 len = count * typesize;
00029
00030 id_sys = (long *) ADIOI_Malloc(sizeof(long));
00031 (*request)->handle = (void *) id_sys;
00032
00033 off = (file_ptr_type == ADIO_INDIVIDUAL) ? fd->fp_ind : offset;
00034
00035 lseek(fd->fd_sys, off, SEEK_SET);
00036 *id_sys = _iread(fd->fd_sys, buf, len);
00037
00038 if ((*id_sys == -1) && (errno == EQNOMID)) {
00039
00040
00041
00042
00043
00044 ADIOI_Complete_async(&err);
00045
00046
00047 *id_sys = _iread(fd->fd_sys, buf, len);
00048
00049 if ((*id_sys == -1) && (errno == EQNOMID)) {
00050 #ifdef PRINT_ERR_MSG
00051 FPRINTF(stderr, "Error in asynchronous I/O\n");
00052 MPI_Abort(MPI_COMM_WORLD, 1);
00053 #else
00054 *error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,
00055 myname, "I/O Error", "%s", strerror(errno));
00056 ADIOI_Error(fd, *error_code, myname);
00057 return;
00058 #endif
00059 }
00060 }
00061 else if (*id_sys == -1) {
00062 #ifdef PRINT_ERR_MSG
00063 FPRINTF(stderr, "Unknown errno %d in ADIOI_PFS_IreadContig\n", errno);
00064 MPI_Abort(MPI_COMM_WORLD, 1);
00065 #else
00066 *error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,
00067 myname, "I/O Error", "%s", strerror(errno));
00068 ADIOI_Error(fd, *error_code, myname);
00069 return;
00070 #endif
00071 }
00072
00073 if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind += len;
00074
00075 (*request)->queued = 1;
00076 (*request)->nbytes = len;
00077 ADIOI_Add_req_to_list(request);
00078 fd->async_count++;
00079
00080 fd->fp_sys_posn = -1;
00081
00082 #ifdef PRINT_ERR_MSG
00083 *error_code = (*id_sys == -1) ? MPI_ERR_UNKNOWN : MPI_SUCCESS;
00084 #else
00085 if (*id_sys == -1) {
00086 *error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,
00087 myname, "I/O Error", "%s", strerror(errno));
00088 ADIOI_Error(fd, *error_code, myname);
00089 }
00090 else *error_code = MPI_SUCCESS;
00091 #endif
00092 }
00093
00094
00095
00096 void ADIOI_PFS_IreadStrided(ADIO_File fd, void *buf, int count,
00097 MPI_Datatype datatype, int file_ptr_type,
00098 ADIO_Offset offset, ADIO_Request *request, int
00099 *error_code)
00100 {
00101 ADIO_Status status;
00102 #ifdef HAVE_STATUS_SET_BYTES
00103 int typesize;
00104 #endif
00105
00106 *request = ADIOI_Malloc_request();
00107 (*request)->optype = ADIOI_READ;
00108 (*request)->fd = fd;
00109 (*request)->datatype = datatype;
00110 (*request)->queued = 0;
00111 (*request)->handle = 0;
00112
00113
00114 ADIOI_PFS_ReadStrided(fd, buf, count, datatype, file_ptr_type,
00115 offset, &status, error_code);
00116
00117 fd->async_count++;
00118 #ifdef HAVE_STATUS_SET_BYTES
00119 if (*error_code == MPI_SUCCESS) {
00120 MPI_Type_size(datatype, &typesize);
00121 (*request)->nbytes = count * typesize;
00122 }
00123 #endif
00124 }