00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "ad_ufs.h"
00010
00011 void ADIOI_UFS_IwriteContig(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_UFS_IWRITECONTIG";
00022 #endif
00023 #endif
00024
00025 *request = ADIOI_Malloc_request();
00026 (*request)->optype = ADIOI_WRITE;
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_UFS_WriteContig(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_UFS_aio(fd, buf, len, offset, 1, &((*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
00074 void ADIOI_UFS_IwriteStrided(ADIO_File fd, void *buf, int count,
00075 MPI_Datatype datatype, int file_ptr_type,
00076 ADIO_Offset offset, ADIO_Request *request, int
00077 *error_code)
00078 {
00079 ADIO_Status status;
00080 #ifdef HAVE_STATUS_SET_BYTES
00081 int typesize;
00082 #endif
00083
00084 *request = ADIOI_Malloc_request();
00085 (*request)->optype = ADIOI_WRITE;
00086 (*request)->fd = fd;
00087 (*request)->datatype = datatype;
00088 (*request)->queued = 0;
00089 (*request)->handle = 0;
00090
00091
00092 ADIOI_UFS_WriteStrided(fd, buf, count, datatype, file_ptr_type,
00093 offset, &status, error_code);
00094
00095 fd->async_count++;
00096
00097 #ifdef HAVE_STATUS_SET_BYTES
00098 if (*error_code == MPI_SUCCESS) {
00099 MPI_Type_size(datatype, &typesize);
00100 (*request)->nbytes = count * typesize;
00101 }
00102 #endif
00103 }
00104
00105
00106
00107
00108
00109
00110 int ADIOI_UFS_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset,
00111 int wr, void *handle)
00112 {
00113 int err=-1, fd_sys;
00114
00115 #ifndef NO_AIO
00116 int error_code;
00117 #ifdef AIO_SUN
00118 aio_result_t *result;
00119 #else
00120 struct aiocb *aiocbp;
00121 #endif
00122 #endif
00123
00124 fd_sys = fd->fd_sys;
00125
00126 #ifdef AIO_SUN
00127 result = (aio_result_t *) ADIOI_Malloc(sizeof(aio_result_t));
00128 result->aio_return = AIO_INPROGRESS;
00129 if (wr) err = aiowrite(fd_sys, buf, len, offset, SEEK_SET, result);
00130 else err = aioread(fd_sys, buf, len, offset, SEEK_SET, result);
00131
00132 if (err == -1) {
00133 if (errno == EAGAIN) {
00134
00135
00136
00137
00138
00139 ADIOI_Complete_async(&error_code);
00140 if (wr) err = aiowrite(fd_sys, buf, len, offset, SEEK_SET, result);
00141 else err = aioread(fd_sys, buf, len, offset, SEEK_SET, result);
00142
00143 while (err == -1) {
00144 if (errno == EAGAIN) {
00145
00146 sleep(1);
00147 if (wr) err = aiowrite(fd_sys, buf, len, offset, SEEK_SET, result);
00148 else err = aioread(fd_sys, buf, len, offset, SEEK_SET, result);
00149 }
00150 else {
00151 FPRINTF(stderr, "Unknown errno %d in ADIOI_UFS_aio\n", errno);
00152 MPI_Abort(MPI_COMM_WORLD, 1);
00153 }
00154 }
00155 }
00156 else {
00157 FPRINTF(stderr, "Unknown errno %d in ADIOI_UFS_aio\n", errno);
00158 MPI_Abort(MPI_COMM_WORLD, 1);
00159 }
00160 }
00161
00162 *((aio_result_t **) handle) = result;
00163 #endif
00164
00165 #ifdef NO_FD_IN_AIOCB
00166
00167 aiocbp = (struct aiocb *) ADIOI_Malloc(sizeof(struct aiocb));
00168 aiocbp->aio_whence = SEEK_SET;
00169 aiocbp->aio_offset = offset;
00170 aiocbp->aio_buf = buf;
00171 aiocbp->aio_nbytes = len;
00172 if (wr) err = aio_write(fd_sys, aiocbp);
00173 else err = aio_read(fd_sys, aiocbp);
00174
00175 if (err == -1) {
00176 if (errno == EAGAIN) {
00177
00178
00179
00180 ADIOI_Complete_async(&error_code);
00181 if (wr) err = aio_write(fd_sys, aiocbp);
00182 else err = aio_read(fd_sys, aiocbp);
00183
00184 while (err == -1) {
00185 if (errno == EAGAIN) {
00186
00187 sleep(1);
00188 if (wr) err = aio_write(fd_sys, aiocbp);
00189 else err = aio_read(fd_sys, aiocbp);
00190 }
00191 else {
00192 FPRINTF(stderr, "Unknown errno %d in ADIOI_UFS_aio\n", errno);
00193 MPI_Abort(MPI_COMM_WORLD, 1);
00194 }
00195 }
00196 }
00197 else {
00198 FPRINTF(stderr, "Unknown errno %d in ADIOI_UFS_aio\n", errno);
00199 MPI_Abort(MPI_COMM_WORLD, 1);
00200 }
00201 }
00202
00203 *((struct aiocb **) handle) = aiocbp;
00204
00205 #elif (!defined(NO_AIO) && !defined(AIO_SUN))
00206
00207
00208 aiocbp = (struct aiocb *) ADIOI_Calloc(sizeof(struct aiocb), 1);
00209 aiocbp->aio_fildes = fd_sys;
00210 aiocbp->aio_offset = offset;
00211 aiocbp->aio_buf = buf;
00212 aiocbp->aio_nbytes = len;
00213
00214 #ifdef AIO_PRIORITY_DEFAULT
00215
00216 aiocbp->aio_reqprio = AIO_PRIO_DFL;
00217 aiocbp->aio_sigevent.sigev_signo = 0;
00218 #else
00219 aiocbp->aio_reqprio = 0;
00220 #endif
00221
00222 #ifdef AIO_SIGNOTIFY_NONE
00223
00224 aiocbp->aio_sigevent.sigev_notify = SIGEV_NONE;
00225 #else
00226 aiocbp->aio_sigevent.sigev_signo = 0;
00227 #endif
00228
00229 if (wr) err = aio_write(aiocbp);
00230 else err = aio_read(aiocbp);
00231
00232 if (err == -1) {
00233 if (errno == EAGAIN) {
00234
00235
00236
00237 ADIOI_Complete_async(&error_code);
00238 if (wr) err = aio_write(aiocbp);
00239 else err = aio_read(aiocbp);
00240
00241 while (err == -1) {
00242 if (errno == EAGAIN) {
00243
00244 sleep(1);
00245 if (wr) err = aio_write(aiocbp);
00246 else err = aio_read(aiocbp);
00247 }
00248 else {
00249 FPRINTF(stderr, "Unknown errno %d in ADIOI_UFS_aio\n", errno);
00250 MPI_Abort(MPI_COMM_WORLD, 1);
00251 }
00252 }
00253 }
00254 else {
00255 FPRINTF(stderr, "Unknown errno %d in ADIOI_UFS_aio\n", errno);
00256 MPI_Abort(MPI_COMM_WORLD, 1);
00257 }
00258 }
00259
00260 *((struct aiocb **) handle) = aiocbp;
00261 #endif
00262
00263 return err;
00264 }